我遇到了Hibernate的问题 . 我目前的项目是一个小游戏 . 在这个游戏中你有 Board ,其中有许多 Fields ,每个 Token .
我可以在没有任何问题的情况下对空数据库进行选择,但是如果我将一个对象放入其中(保存工作没有任何异常,之后数据库值看起来很好)我得到了异常 .
Board类中有趣的部分:
@OneToMany(fetch=FetchType.EAGER)
@MapKey(name = "point")
public Map<Point, Field> getGameMatrix() {
return gameMatrix;
}
我获得董事会的查询:
return getHibernateTemplate().loadAll(Board.class);
日志现在出现了这个:
Hibernate:选择this_.id为id0_2_,this_.uniqueClassName为uniqueCl3_0_2_,this_.borderDimension为borderDi4_0_2_,this_.dimension为dimension0_2_,this_.TYPE为TYPE0_2_,gamematrix2_.Board_id为Board1_4_,field3_.id为gameMatrix2_4_,(选择a11 . 从字段a11开始,其中a11.id = gamematrix2_.gameMatrix_id)为formula0_4_,field3_.id为id1_0_,field3_.point为point1_0_,field3_.token_id为token3_1_0_,token4_.id为id2_1_,token4_.name为name2_1_,token4_.uniqueClassName as uniqueCl4_2_1_,token4_.TYPE as TYPE2_1_ from Board this_ left outer join Board_Field gamematrix2_ on this_.id = gamematrix2_.Board_id left outer join field field3_ on gamematrix2_.gameMatrix_id = field3_.id left outer join Token token4_ on field3_.token_id = token4_.id
直到它看起来不错,但Hibernate执行以下操作:
Hibernate: delete from Board_Field where Board_id=?
Hibernate: insert into Board_Field (Board_id, gameMatrix_id) values (?, ?)
我得到了这个例外:
线程“AWT-EventQueue-0”中的异常org.springframework.dao.InvalidDataAccessApiUsageException:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:Field;嵌套异常是org.hibernate.TransientObjectException:object引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:Field
我不明白为什么它会删除它 .
有任何想法吗?
谢谢
4 回答
我的同事有类似的问题 . 他现在不是,但事情与数据库完整性有关 .
似乎Hibernate有更多的约束定义了数据库 . 当它加载一些数据时,Hibernate看到数据库中的某些记录不能存在,并试图删除它 .
尝试检查是否违反了某些应该但未定义的外键,并尝试使数据保持一致 .
您需要设置
cascade
属性:您还需要覆盖
hashCode()
和equals()
forPoint
和Field
- 让您的IDE(Eclipse,NetBeans,IntelliJ)使用他们的业务密钥(即不是他们自动生成的ID)为您生成它们在我看来,你正在向Board类中的Fields集合添加一个Field对象,但你必须先保留新的Field对象(你可能是新的)
因此异常消息:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:Field
不久之前有过类似的问题,虽然这个问题已经回答了,但我想把它发布在这里以供将来参考 .
基本上,当setter实际为空时,我遇到了相同的行为(因为赋值不存在或者不正确,或者setter中存在导致它实际上为null的业务逻辑) .
猜测hibernate首先选择并将数据视为持久性(持久性级别缓存),然后当它执行脏检查时发现数据已被删除(因为getter不会返回数据,因为它从未设置过)和继续开火删除 .
已经发布了关于它in hibernate forums .
只需将其发布在此处以供将来参考!
关心拉文德拉