我遇到了Hibernate的问题。
我目前的项目是一个小游戏。在这个游戏中你有一个 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 as uniqueCl3_0_2_,this_.borderDimension as borderDi4_0_2_,this_.dimension as dimension0_2_,this_.TYPE为TYPE0_2_, gamematrix2_.Board_id为Board1_4_, field3_.id as gameMatrix2_4_,(选择 a11.point来自Field a11 a11.id = gamematrix2_.gameMatrix_id)as 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为 TYPE2_1_来自Board this_ left outer 加入Board_Field gamematrix2_ this_.id = gamematrix2_.Board_id离开了 外连接字段field3_ on gamematrix2_.gameMatrix_id = field3_.id 左外连接令牌令牌4上 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: 对象引用未保存的瞬态 instance - 保存瞬态实例 冲洗前:场;嵌套 例外是 org.hibernate.TransientObjectException: 对象引用未保存的瞬态 instance - 保存瞬态实例 冲洗前:Field
我不明白为什么要删除这句话
任何想法?
感谢
答案 0 :(得分:1)
我的同事有类似的问题。他现在不是,但事情与数据库完整性有关。
似乎Hibernate有更多的约束定义了数据库。当它加载一些数据时,Hibernate看到数据库中的某些记录不能存在,并试图删除它。
尝试检查是否违反了某些应该但未定义的外键,并尝试使数据保持一致。
答案 1 :(得分:1)
您需要设置cascade
属性:
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@MapKey(name = "point")
public Map<Point, Field> getGameMatrix() {
return gameMatrix;
}
您还需要为hashCode()
和equals()
覆盖Point
和Field
- 让您的IDE(Eclipse,NetBeans,IntelliJ)为您生成它们,使用它们业务密钥(即不是他们自动生成的ID)
答案 2 :(得分:0)
在我看来,你正在向Board类中的Fields集合添加一个Field对象,但是你必须先保留新的Field对象(你可能是新的)
因此异常消息:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:Field
答案 3 :(得分:0)
不久前,有一个类似的问题,尽管这个问题已经得到回答,但我想将其发布在这里,以备将来参考。
基本上,当设置器实际上为空时,我遇到了相同的行为(要么是由于分配不存在或不正确,要么是因为设置器中存在业务逻辑,导致分配器实际上为空)。
Guess休眠首先选择并认为数据是持久性的(持久性级别缓存),然后在进行脏检查时发现数据已被删除(因为getter不会返回数据,因为它从未被使用过)设置)并继续执行删除操作。
也为此发布过in hibernate forums。
只需在此处发布以供将来参考!
问候 拉文德拉