Hibernate NewbieQuestion:我是否可以以某种方式将参数传递给Spring+;从刀上冬眠?
在我目前正在编写的代码中,我遇到了一段代码,其中MyClass的字段应该根据使用的语言进行设置。但实际上,语言代码已经硬编码到Hibernate用户类型类中。我需要告诉Hibernate正在使用哪种语言,但我如何才能做到这一点呢 下面是修改后的代码版本,以尽可能针对具体问题 类I18nStringUserTypeHibernate 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
/**
* 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 localstatic
字段,如下所示:
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字符串来填充对象字段。我发现语言和对象之间的耦合程度很低,上下文方法感觉很粗糙(正如您所注意到的)。