我在hibernate映射文件中有一个字段......
<property name="dateAdded" column="date_added" type="java.util.Date"></property>
我希望在收到来自上游的更新时阻止该字段更新。通常,理想情况下,我会告诉hibernate不要更新字段
<property name="dateAdded" column="date_added" type="java.util.Date" update="false"></property>
但映射是基础jar的一部分,但我还没有说服所有者进行此更改。
是否有一种清洁的替代方法可以达到同样的效果?
我试图避免将映射文件复制到我的项目中,更改它并使用更改的文件,或编写任何大量的代码来查找数据库中的记录并将现有的dateAdded值应用于更新记录
答案 0 :(得分:0)
一个想法是编写一个拦截器(最好的方法是扩展EmptyInterceptor)并覆盖onFlushDirty方法:
@Override
public boolean onFlushDirty(Object entity, Serializable id,Object[] currentState, Object[] previousState,String[] propertyNames, Type[] types)
{
boolean modified=false;
if (entity instanceof YourEntity)
{
for (int i=0;i<propertyNames.length;i++)
{
String prop=propertyNames[i];
if (prop.equals("dateAdded"))
{
if (!currentState[i].equals(previousState[i]))
{
currentState[i]=previousState[i];
modified=true;
}
}
}
}
return modified;
}
您可以使用
添加拦截器org.hibernate.SessionFactory.withOptions().interceptor(yourInterceptor);
返回一个SessionBuilder,通过它你可以获得你的休眠会话。
我不知道这是否是最佳方法,但它应该有效。