Java Hibernate对选择的对象执行删除操作
我正面临Hibernate的问题。 我目前的项目是一个小游戏。在这个游戏中,你有一个棋盘,其中有许多字段,每个字段都有一个标记。 我可以在一个空数据库上进行选择,没有任何问题,但如果我将一个对象放入其中,则保存工作不会出现任何异常,之后数据库值看起来很好,我会遇到异常。 Board课程中有趣的部分:Java Hibernate对选择的对象执行删除操作,java,hibernate,spring,jpa,Java,Hibernate,Spring,Jpa,我正面临Hibernate的问题。 我目前的项目是一个小游戏。在这个游戏中,你有一个棋盘,其中有许多字段,每个字段都有一个标记。 我可以在一个空数据库上进行选择,没有任何问题,但如果我将一个对象放入其中,则保存工作不会出现任何异常,之后数据库值看起来很好,我会遇到异常。 Board课程中有趣的部分: @OneToMany(fetch=FetchType.EAGER) @MapKey(name = "point") public Map<Point, Field> getGameMat
@OneToMany(fetch=FetchType.EAGER)
@MapKey(name = "point")
public Map<Point, Field> getGameMatrix() {
return gameMatrix;
}
日志现在显示了以下内容:
Hibernate:将此\uu.id选择为id0\u 2\u0,
这是唯一的类名
uniqueCl3\u 0\u 2\u,此边界维度
作为borderDi4\u 0\u 2\u,此维度为
尺寸0_2_,此类型为类型0_2_,
gamematrix2_uu.Board_uID为Board1_u4_u,
字段3\u.id作为gameMatrix2\u 4\u,选择
a11.从a11场开始的点,其中
a11.id=gamematrix2_u2;gamematrix2_2;id为
公式0_4_,字段3_.id为id1_0_,
字段3。点作为点1\u 0,
字段3。令牌id作为令牌3\u 1\u 0,
token4_uu0.id为id2_0.1_0,token4_u0.name为
名称2_1_,标记4_。唯一类名称为
uniqueCl4_2_1_,令牌4_。键入为
从左外侧板键入2_1_
加入棋盘游戏
此ux.id=gamematrix2 ux.Board u id左
外部联接字段3_uuon
gamematrix2.gamematrix2.GameMatrixID=field3.id
左外部连接令牌4_uuu打开
字段3_uu.token_uid=token4_u.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:
对象引用未保存的瞬态
实例-保存临时实例
冲洗前:现场;嵌套
例外是
org.hibernate.transientObject异常:
对象引用未保存的瞬态
实例-保存临时实例
冲洗前:现场
我不明白它为什么要做delete语句。
有什么想法吗?
谢谢在我看来,您正在向Board类中的字段集合添加一个Field对象,但是您必须先保留新的Field对象,您可能正在创建它
因此出现了异常消息:对象引用了一个未保存的瞬态实例-在刷新之前保存瞬态实例:Field我的一个同事也遇到了类似的问题。他现在不是,但这件事与数据库完整性有关 Hibernate似乎对数据库定义了更多的约束。当Hibernate加载一些数据时,它发现数据库中一定不存在某些记录,并试图将其删除 尝试检查是否违反了某些应定义但未定义的外键,并尝试使数据一致。您需要设置级联属性:
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@MapKey(name = "point")
public Map<Point, Field> getGameMatrix() {
return gameMatrix;
}
您还需要覆盖hashCode和Point和Field的equals-让您的IDE Eclipse、NetBeans、IntelliJ使用它们的业务密钥(即不是它们的自动生成ID)为您生成它们。很久以前,这个问题也有类似的问题,尽管这个问题已经得到了回答,但我还是将它发布在这里以供将来参考 基本上,当setter实际上为空时,我遇到了相同的行为,原因是赋值不存在或不正确,或者setter中存在导致其实际上为空的业务逻辑 Guess hibernate首先选择并将数据视为持久性持久性级别缓存,然后在执行脏检查时发现数据已被删除,因为getter不会返回数据,因为它从未设置过,并继续触发删除 我也发了关于它的帖子 只是把它贴在这里供将来参考 问候
Ravindra之前的交易是否正常关闭?我正在这样做,当我想保存一块板时,我没有得到异常。保存电路板可以工作,数据库中的值也可以。当我想要选择所有板时,我得到了一个例外。
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
@MapKey(name = "point")
public Map<Point, Field> getGameMatrix() {
return gameMatrix;
}