NewbieQuestion:我可以以某种方式从DAO向Spring + Hibernate传递参数吗?

时间:2010-12-28 17:36:30

标签: hibernate spring orm

在我目前正在处理的代码中,我遇到了一个代码,其中MyClass的字段应该根据使用的语言进行设置。但实际上语言代码已经硬编码到Hibernate UserType类中。我不知何故需要告诉Hibernate使用什么语言,但我怎样才能做到这一点?

以下版本的代码被修改为尽可能具体问题。

class 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);
}

提供MyClass的DAO使用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&amp; Hibernate,对我很温柔;)我不确定这个问题是否充分反映了手头的问题,所以请随意提出一个更有说服力的标题。

1 个答案:

答案 0 :(得分:1)

我个人认为在UserType内部应用i18n并不是一个好主意(你将如何实现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的自然结果。