有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在不更改hibernatemapping的情况下防止字段被更新

我在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) 个答案

  1. # 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,通过它可以获得hibernate会话

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