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

Posted

技术标签:

【中文标题】NewbieQuestion:我能以某种方式从 DAO 向 Spring+Hibernate 传递参数吗?【英文标题】:NewbieQuestion: Can I somehow pass arguments to Spring+Hibernate from a DAO? 【发布时间】:2010-12-28 17:36:30 【问题描述】:

在我目前正在处理的代码中,我遇到了一段代码,其中 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);

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

【问题讨论】:

【参考方案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 的自然结果。

【讨论】:

您对如何实现国际化有什么建议吗?今天我们从数据库中提取所有 i18n 字符串来填充对象的字段。我看到语言和对象之间的耦合处于非常低的水平,并且上下文方法感觉很hacky(正如您所注意到的)。

以上是关于NewbieQuestion:我能以某种方式从 DAO 向 Spring+Hibernate 传递参数吗?的主要内容,如果未能解决你的问题,请参考以下文章

我能以某种方式在第一个“then”中获得 fetch 响应吗?

libgdx- pixmap:我能以某种方式改变线条的宽度吗?

Android 从电池视图中获取电池时间

2 服务沟通

Ant 动态加载 .properties 文件

找出谁在调用方法