Это способ использовать тип HibernateCompositeUser для обработки локализованного содержание?


Я пытаюсь использовать HibernateCompositeUser типа для обработки как i18n конкретных данных в моем приложении. Я пытаюсь использовать ниже подход.

У меня есть таблица с именем главной таблицы , которая содержит всю локаль независимых данных, в то время как я создал другую таблицу master_translation , который содержит все язык конфиденциальной информации. Основная таблица содержит ссылку на master_translation.

Здесь представлена детальная структура таблицы:

master
 ---ID
 ---master_translation
 ---Other locale independent fields.

master_translation
 ---ID
 ---language_id
 ---Other locale sensitive fields

Теперь я использую HibernateCompositeUser типа, чтобы справиться с этим внутренним процессом. Вот это сопоставление для мастер-класса:

<hibernate-mapping>
    <class name="Master"
        table="MASTER">
        <id name="uuid" type="java.lang.String">
            <column name="UUID" />
            <generator class="uuid" />
        </id>

        <property name="master_i18n" type="masteri18n">
           <column name="NAME"/>
           <column name="SHORTDESCRIPTION"/>
           <column name="LONGDESCRIPTION"/>
    </class>
</hibernate-mapping>

где тип="masteri18n" является гибернации CompositeUserType.сейчас.

Когда я выборки в контент-мастер, это правильно выборке данных на основе языка и мой мастер-класс содержит ссылку на Master_translation , который держит язык конкретных данных.

Я справляюсь с этим делом:

public Object nullSafeGet(ResultSet rs, String[] arg1,
        SessionImplementor arg2, Object arg3) throws HibernateException,
        SQLException {

    Master_i18n master_i18n=Master_i18n.getInstance();
    master_i18n=dao.getMaster_i18n(rs.getString(arg1[0]), "nl_NL");;

    //return Master_i18n.getName();
    return Master_i18n;
}

@Override
public void nullSafeSet(PreparedStatement ps, Object arg1, int index,
            SessionImplementor arg3) throws HibernateException, SQLException {

    if(arg1==null){
        ps.setNull(index, Hibernate.STRING.sqlType());
        //ps.setNull(index+1, Hibernate.STRING.sqlType());
        //ps.setNull(index+2, Hibernate.STRING.sqlType());set
    }
    else{
         Master_i18n des=(Master_i18n)arg1;
         des=dao.saveMaster_i18n(des);
         ps.setString(index, des.getUuid());
         ps.setString(index+1, des.getUuid());
         ps.setString(index+2, des.getUuid());
         ps.setString(index+3, des.getUuid());    
    }
}

Как-то я не чувствую себя уверенно о моем подходе. Я осуществляет это правильно или нет?



617
11
задан 11 апреля 2011 в 05:04 Источник Поделиться
Комментарии
1 ответ

Я не слишком хорошо знакомы с Hibernate, так что только некоторые общие замечания:


  1. СУБД обычно чувствительны к регистру имен атрибутов, так много людей использовать символ подчеркивания для разделения слов в именах атрибутов и таблиц.


    <column name="SHORTDESCRIPTION"/>
    <column name="LONGDESCRIPTION"/>

    В случае выше SHORT_DESCRIPTION и LONG_DESCRIPTION будет легче читать.



  2.     Master_i18n master_i18n=Master_i18n.getInstance();
    master_i18n=dao.getMaster_i18n(rs.getString(arg1[0]), "nl_NL");;

    Master_i18n.деыпзьапсе() вызов выглядит лишней, так как на следующей строке локальная переменная перезаписывается. Ниже приведен тот же (и первая линия, возможно, не потребуется вообще):

    Master_i18n.getInstance();
    Master_i18n master_i18n=dao.getMaster_i18n(rs.getString(arg1[0]), "nl_NL");;


  3. <id name="uuid" type="java.lang.String">

    Ява.яз.Строка может быть просто строкой здесь.



  4. public Object nullSafeGet(ResultSet rs, String[] arg1,
    SessionImplementor arg2, Object arg3) throws HibernateException,
    SQLException {

    Master_i18n master_i18n=Master_i18n.getInstance();
    master_i18n=dao.getMaster_i18n(rs.getString(arg1[0]), "nl_NL");;

    //return Master_i18n.getName();
    return Master_i18n;
    }


    Я думаю, что в настоящее время он не компилируется, поскольку возвращение Master_i18n является капитализированных Master_i18n который, кажется, класса, а не локальной переменной.



  5. master_i18n=dao.getMaster_i18n(rs.getString(arg1[0]), "nl_NL");;

    nl_NL может быть параметр/постоянный. (Каждый абонент хочет использовать этот язык?) (Один из точки с запятой в конце строки.)


  6. Я бы использовал более и более описательные имена переменных, чем ПС, РС, арг1, значение arg3. Длинные имена бы сделать код более читабельным, поскольку читатели не должны расшифровать аббревиатуры каждый раз, когда они читают код и не должны догадаться, что аббревиатура автор использует.

    (Чистый код Роберт С. Мартин, избежать ментального картографирования, Р25)


  7. Master_i18n довольно уродливое имя класса. Это не следовать обычным верблюжьего именования.

  8. Это также похоже на синглтон-это, скорее, сейчас антиобразец. Они делают тестирование сложнее и часто скрывают зависимостей, которая ведет к спагетти-код, который очень трудно работать.


6
ответ дан 19 марта 2014 в 10:03 Источник Поделиться