如何在不更改hibernate-mapping的情况下防止更新字段

时间:2015-08-14 08:27:52

标签: java hibernate hibernate-mapping

我在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值应用于更新记录

1 个答案:

答案 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,通过它你可以获得你的休眠会话。

我不知道这是否是最佳方法,但它应该有效。