2010-12-28 4 views
2

현재 코드에서 MyClass의 필드가 사용중인 언어에 따라 설정되어야하는 조각 코드를 발견했습니다. 그러나 실제로는 언어 코드가 Hibernate UserType 클래스에 하드 코딩되어있다. 나는 어쨌든 Hibernate에게 사용중인 언어를 말할 필요가있다. 그러나 이것을 어떻게 할 수 있는가?NewbieQuestion : 어떻게 DAO에서 Spring + 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에 봄의 HibernateDaoSupport를 클래스를 사용하여 공급한다 DAO. 어떻게 든 특정 언어를 사용하도록하는 인수를 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> 

나는 단지이 봄 & 최대 절전 모드에 노출 된, 그래서 나를 부드러운 운임, 문제는 충분히 손에서 문제를 반영하면 내가 확실하지 오전), 그래서 더 이야기 제목을 제안 주시기 바랍니다.

답변

1

개인적으로 UserType 내부에 i18n을 적용하는 것이 좋지 않다고 생각합니다. (nullSafeSet을 어떻게 구현합니까?) 더 높은 수준에서 i18n 코드를 해결하는 것이 좋습니다.

실제로 그렇게해야하는 경우 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); 
    } 
} 

이 솔루션은 추한이지만,이 수준에서 국제화를 구현하는 자연적인 결과이다 : 예를 들어, 다음과 같이 스레드 로컬 static 필드 것을 사용.

+1

국제화를 수행하는 방법에 대한 정보가 있습니까? 오늘 우리는 모든 i18n 문자열을 데이터베이스에서 추출하여 객체의 필드를 채 웁니다. 나는 언어와 사물의 결합이 매우 낮다는 것을 알았고 문맥 접근법은 해킹 된 것으로 느낀다. – oligofren

관련 문제