【发布时间】:2013-05-09 09:17:31
【问题描述】:
假设我有两个类 Foo 和 Bar。 Foo 与 Bar 有一个多对一 关联,映射如下:
<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