Hibernate在Select上执行Delete

时间:2010-02-24 08:46:00

标签: java hibernate spring jpa

我遇到了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

我不明白为什么要删除这句话 任何想法?
感谢

4 个答案:

答案 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()覆盖PointField - 让您的IDE(Eclipse,NetBeans,IntelliJ)为您生成它们,使用它们业务密钥(即不是他们自动生成的ID)

答案 2 :(得分:0)

在我看来,你正在向Board类中的Fields集合添加一个Field对象,但是你必须先保留新的Field对象(你可能是新的)

因此异常消息:对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例:Field

答案 3 :(得分:0)

不久前,有一个类似的问题,尽管这个问题已经得到回答,但我想将其发布在这里,以备将来参考。

基本上,当设置器实际上为空时,我遇到了相同的行为(要么是由于分配不存在或不正确,要么是因为设置器中存在业务逻辑,导致分配器实际上为空)。

Guess休眠首先选择并认为数据是持久性的(持久性级别缓存),然后在进行脏检查时发现数据已被删除(因为getter不会返回数据,因为它从未被使用过)设置)并继续执行删除操作。

也为此发布过in hibernate forums

只需在此处发布以供将来参考!

问候 拉文德拉