0

我在我的Spring/Hibernate应用程序中与i18n设置纠缠在一起。我现在试图遵循这个配方:http://www.theserverside.com/news/1377072/Internationalized-Data-in-Hibernate是否可以关闭UserType的二级缓存?

只要我不使用第二级缓存它工作。当我使用它时,即使稍后改变语言,第一个值也会被缓存并返回。 (通过拆卸和组装方法)。我真的希望有人可以帮助我,因为我需要缓存CarType实体,而不是userType部分。 (I18nLocaleHolder使用内存映射)

谢谢!

这里是实体类的一部分:

@Cache(usage = CacheConcurrencyStrategy.READ_ONLY) 
    @Immutable 
    @Table(name = "CAR_TYPE") 
    public class CarType implements Serializable { 

     @Id 
     private Long id; 

     @Type(type = "LocalizedLabelUserType") 
     private String description; 

     ... 

这里是用户类型: 公共类LocalizedLabelUserType实现用户类型{

@Override 
    public int[] sqlTypes() { 
     return new int[] { Types.INTEGER }; 
    } 

    @Override 
    public Class<String> returnedClass() { 
     return String.class; 
    } 

    @Override 
    public boolean equals(Object x, Object y) throws HibernateException { 
     return x == y; 
    } 

    @Override 
    public int hashCode(Object x) throws HibernateException { 
     return x == null ? 0 : x.hashCode(); 
    } 

    @Override 
    public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, 
     SQLException { 
     Long labelId = (Long) LongType.INSTANCE.nullSafeGet(rs, names, session, owner); 
     return I18nLocaleHolder.getDescription(labelId, LocaleContextHolder.getLocale().getLanguage()); 
    } 

    @Override 
    public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, 
     SQLException { 
     Long code = I18nLocaleHolder.getCode((String) value, LocaleContextHolder.getLocale().getLanguage()); 
     LongType.INSTANCE.nullSafeSet(st, code, index, session); 
    } 

    @Override 
    public Object deepCopy(Object value) throws HibernateException { 
     return value; 
    } 

    @Override 
    public boolean isMutable() { 
     return false; 
    } 

    @Override 
    public Serializable disassemble(Object value) throws HibernateException { 
     return (Serializable) value; 
    } 

    @Override 
    public Object assemble(Serializable cached, Object owner) throws HibernateException { 
     return cached; 
    } 

    @Override 
    public Object replace(Object original, Object target, Object owner) throws HibernateException { 
     return original; 
    } 
} 

回答

0

注释@Immutable将需要删除,否则休眠将不会检测到类CarType的更改说明。

然后改变CarTypeREAD_ONLYREAD_WRITE缓存将仍然允许实体被缓存,但是当实体获取的更新数据库,缓存将反映description新值:

@Table(name = "CAR_TYPE") 
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) 
public class CarType implements Serializable { 
    ... 
} 
+0

喜,并感谢您回答我。我已经尝试过您的解决方案,但不幸的是它没有工作。然而,我设法让它工作,但解决方案有点冒失,所以我不会将它作为答案。总结一下,我从nullSafeGet返回描述,并在反汇编中得到并返回代码。然后所有下面的调用将包括代码,我可以从语言缓存中获取正确的文本。另外,我必须修改使用Cachable注释的Query注释。 (需要输入语言,所以这绝对是hacky) – user2326720