Hibernate NewbieQuestion:我是否可以以某种方式将参数传递给Spring+;从刀上冬眠?

Hibernate NewbieQuestion:我是否可以以某种方式将参数传递给Spring+;从刀上冬眠?,hibernate,spring,orm,Hibernate,Spring,Orm,在我目前正在编写的代码中,我遇到了一段代码,其中MyClass的字段应该根据使用的语言进行设置。但实际上,语言代码已经硬编码到Hibernate用户类型类中。我需要告诉Hibernate正在使用哪种语言,但我如何才能做到这一点呢 下面是修改后的代码版本,以尽可能针对具体问题 类I18nStringUserType /** * Gets a localized string based on the key and current language * TODO: Remove hardcod

在我目前正在编写的代码中,我遇到了一段代码,其中MyClass的字段应该根据使用的语言进行设置。但实际上,语言代码已经硬编码到Hibernate用户类型类中。我需要告诉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);
}
提供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>

...

我刚刚经历了春天和冬眠,所以对我温和一点吧;)我不确定这个问题是否充分反映了当前的问题,所以请随意建议一个更能说明问题的标题。

我个人认为在
用户类型中应用i18n不是一个好主意(您将如何实现
nullSafeSet
),最好在更高级别上解决i18n代码

但如果确实需要这样做,您需要引入某种“上下文”,通过
静态
字段访问。例如,使用thread local
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);
    }
}
公共类ThreadI18nContext{
私有静态最终ThreadLocal语言=新ThreadLocal(){
受保护的字符串initialValue(){返回“US”;}
}
公共静态字符串getLanguage(){
返回语言get();
}
公共静态void setLanguage(字符串l){
语言。集合(l);
}
}

这个解决方案很难看,但它是在这个级别上实现i18n的自然结果。

您有什么关于如何实现国际化的提示吗?今天,我们从数据库中取出所有i18n字符串来填充对象字段。我发现语言和对象之间的耦合程度很低,上下文方法感觉很粗糙(正如您所注意到的)。