NewbieQuestion: Могу ли я как-то передать аргументы в Spring + Hibernate из DAO? - PullRequest
2 голосов
/ 28 декабря 2010

В коде, над которым я сейчас работаю, я наткнулся на фрагмент кода, где поля MyClass должны быть установлены в соответствии с используемым языком. Но на самом деле код языка был жестко закодирован в класс Hibernate UserType. Мне как-то нужно сказать Hibernate, какой язык используется, но как мне это сделать?

Ниже приведены версии кода, модифицированные так, чтобы они были как можно более специфичными для проблемы.

класс I18nStringUserType

/**
 * Gets a localized string based on the key and current language
 * TODO: Remove hardcoded language value
 * 
 * @see org.hibernate.usertype.
 *   UserType#nullSafeGet(ResultSet, String[], Object)
**/
public Object nullSafeGet(ResultSet rs, String[] names, 
       Object owner) throws Exception 
{
    String key = (String) Hibernate.STRING.nullSafeGet(rs, names);
    String language = "US"; // design-smell. FIX!
    return I18nStringFactory.getI18nString(key, language);
}

DAO, поставляющий MyClass, использует класс Spring HibernateDaoSupport. Могу ли я как-то изменить это, чтобы передать аргументы в Hibernate, который говорит ему использовать какой-то определенный язык?

public class HibernateMyClassDAO extends HibernateDaoSupport{
    public MyClass get(Long id) {
        MyClass fund =  (MyClass) getHibernateTemplate().get(MyClass.class, id);
    }
}

Это отредактированная версия отображения Hibernate. Не знаю, нужно ли это.

<hibernate-mapping>
    <class name="MyClass" table="MYCLASS" >

        <id name="id" type="java.lang.Long" column="ID" />
        <property  name="description" column="I18DESCRIPTION" 
            insert="false" update="false"
            type="18nStringUserType"/>
    </class>
    ...
</hibernate-mapping>

У меня только что был контакт с Spring & Hibernate, так что будьте осторожны со мной;) Я не уверен, что вопрос адекватно отражает имеющуюся проблему, поэтому не стесняйтесь предлагать более выразительное название.

1 Ответ

1 голос
/ 28 декабря 2010

Лично я не считаю хорошей идеей применять i18n внутри UserType (как бы вы реализовали nullSafeSet?), Было бы лучше разрешить код i18n на более высоких уровнях.если это действительно требуется, вам нужно ввести некий «контекст», доступный через поля static.Например, используя локальное поле потока static, что-то вроде этого:

public class ThreadI18nContext {
    private static final ThreadLocal<String> language = new ThreadLocal<String>() {
        protected String initialValue() { return "US"; }
    }

    public static String getLanguage() {
        return language.get();
    }

    public static void setLanguage(String l) {
        language.set(l);
    }
}

Это решение уродливо, но это естественный результат реализации i18n на этом уровне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...