首页 文章

Hibernate在Select上执行Delete

提问于
浏览
1

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

  • 1

    我的同事有类似的问题 . 他现在不是,但事情与数据库完整性有关 .

    似乎Hibernate有更多的约束定义了数据库 . 当它加载一些数据时,Hibernate看到数据库中的某些记录不能存在,并试图删除它 .

    尝试检查是否违反了某些应该但未定义的外键,并尝试使数据保持一致 .

  • 0

    您需要设置 cascade 属性:

    @OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
    @MapKey(name = "point")
    public Map<Point, Field> getGameMatrix() {
         return gameMatrix;
    }
    

    您还需要覆盖 hashCode()equals() for PointField - 让您的IDE(Eclipse,NetBeans,IntelliJ)使用他们的业务密钥(即不是他们自动生成的ID)为您生成它们

  • 0

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

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

  • 1

    不久之前有过类似的问题,虽然这个问题已经回答了,但我想把它发布在这里以供将来参考 .

    基本上,当setter实际为空时,我遇到了相同的行为(因为赋值不存在或者不正确,或者setter中存在导致它实际上为null的业务逻辑) .

    猜测hibernate首先选择并将数据视为持久性(持久性级别缓存),然后当它执行脏检查时发现数据已被删除(因为getter不会返回数据,因为它从未设置过)和继续开火删除 .

    已经发布了关于它in hibernate forums .

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

    关心拉文德拉

相关问题