【问题标题】:How to prevent a field being updated without changing hibernate-mapping如何防止在不更改休眠映射的情况下更新字段
【发布时间】:2015-08-14 08:27:52
【问题描述】:

我在休眠映射文件中有一个字段...

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

【问题讨论】:

    标签: java hibernate hibernate-mapping


    【解决方案1】:

    一个想法是编写一个拦截器(最好的方法是扩展 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,您可以通过它获取您的休眠会话。

    我不知道这是否是最好的方法,但它应该可以工作。

    【讨论】:

      猜你喜欢
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-15
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      • 1970-01-01
      相关资源
      最近更新 更多