【问题标题】:Hibernate Interceptor, modifying current state in onSave results in SQL updateHibernate 拦截器,修改 onSave 中的当前状态导致 SQL 更新
【发布时间】:2013-05-09 09:17:31
【问题描述】:

假设我有两个类 FooBarFooBar 有一个多对一 关联,映射如下:

<many-to-one name="bar" class="Bar" lazy="false" fetch="join" >
    <column name="BAR_ID" sql-type="INTEGER" />
</many-to-one>

我创建了一个自定义拦截器,它从 EmptyInterceptor 扩展并覆盖 onSave 方法,如下所示:

public boolean onSave(Object entity, Serializable id, Object[] state,
        String[] propertyNames, Type[] types) {
    boolean modified = false;

    if(entity instanceof Foo) {
        Bar bar = new Bar();

        //do some initialization stuff to bar

        for(int i = 0; i < propertyNames.length; i++) {
             if("bar".equals(propertyNames[i])) {
                 state[i] = bar;
                 modified = true;
                 break;
             } 
        }

        //This code essentially gets the current hibernate session and calls save on
        //the passed object.
        BarDAO barDao = BarDAO.INSTANCE;
        barDAO.save(bar);
    }

    return modified;
} 

问题是虽然对bar执行了SQL插入语句,但是对实体对象执行了SQL更新语句,实体对象是Foo,在插入前被修改了。这会导致以下 Hibernate 异常。

最后一个原因:批量更新从更新返回了意外的行数 [0];实际行数:0;预计:1

如果我不保存 bar 对象,则按预期执行 SQL 插入语句。

对可能出了什么问题有任何见解吗?

提前致谢。

【问题讨论】:

    标签: java hibernate interceptor


    【解决方案1】:

    我认为您需要在拦截器的 onFlushDirty 方法中更新 currentState 数组。

    有一个类似的问题,因为我正在修改 onLoadonFlushDirty 方法中的对象。问题是休眠认为对象的先前状态是由 onLoad 方法产生的状态,而更新语句试图使用这些值来查找 db 表中的行。可能是同样的问题,因为您正在修改 onSave 方法中的状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-06
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 2020-06-12
      • 2015-07-16
      相关资源
      最近更新 更多