当前位置: 首页 > 知识库问答 >
问题:

Spring data JPA/Hibernate删除错误

暨成双
2023-03-14

我在jpa删除传播中遇到了一些奇怪问题:我有一个对象A,它与对象C有一对多关系。我有另一个对象B,它与对象C有一对一关系(A-C和B-C),当我试图删除一个'a'对象时,然后Hibernate删除它,而不删除它的C对象。但在此之前,它尝试使用第二个关系商店选择C对象

以下是日志:

Hibernate: select ... from A A0_ where A0_.external_id=?
Hibernate: select ... from C C0_ inner join B B1_ on C0_.B_id=B1_.id  where C0_.A_id=?
Hibernate: select ... from C C0_ inner join B B1_ on C0_.B_id=B1_.id  where C0_.B_id=?
Hibernate: delete from A where id=?

下面是我的代码:

在类中:

@OneToOne(mappedBy = "a", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private C c;

在B类中:

@OneToMany(mappedBy = "b", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private List<C> cs;

在C类中:

@OneToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "a_id", nullable = false)
private A a;

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "b_id", referencedColumnName = "id", nullable = false)
private B b;

共有1个答案

颛孙森
2023-03-14

您必须将A中包含的CB中包含的C列表中删除,因为如果已删除的实体被持久化(直接或通过级联持久化操作),则Hibernate必须取消删除操作的计划。

该行为是JPA规范所要求的;有关更多详细信息,请参阅此问题。

而且,你可能会发现这个答案很有用;它很好地描述了删除和取消调度的过程。

 类似资料:
  • 我正在从事一个java web项目,该项目使用: > Spring Hibernate/JPA MySQL-(在EasyPHP/PHPMyAdmin上)JDBC 当我想删除一些数据时,我遇到了一个错误。但是,只有当我想删除一个有子级的父行并且他的一个子行也至少有一个子行时,这个问题才存在。 目标:我希望操作/查询删除所选行及其子行和子行。 错误代码:在服务器输出中 28-Sep-2016 11:5

  • 问题内容: 当我尝试从数据库中删除条目时,使用 然后我可以执行以下操作: 1)如果该行存在于数据库中,则将执行两个SQL查询:一个选择,然后一个删除 2)如果数据库中不存在该行,则仅执行选择查询 但是同样,更新不是这种情况。无论是否存在数据库行,都只会执行更新查询。 请让我知道为什么这种行为用于删除操作。这不是性能问题,因为遇到了两个查询而不是一个查询? 编辑: 我正在使用hibernate3.2

  • 我有两个具有一个任意关系的表 类ServiceProvider{ ... @OneTomany(Fetch=FetchType.Eager,MappedBy=“ServiceProvider”,Cascade={CascadeType.All,CascadeType.Remove},OlphanRemove=true)@OnDelete(action=OnDeleteAction.Cascade)

  • 我有一个非常简单的Spring靴测试 我要从父实体中删除子实体。链接使用的是单向,拥有实体是父实体。我试着给1打电话。,但hibernate最终生成了一个update语句,将parent_name设置为null(而不是delete where parent_name=“father”),这违反了子表中的不可为null约束。 然后我试着打电话给2。,这一次它给出了一个异常。 你如何修复上面的,以使儿

  • 我试图通过联接表的一个外键级联删除联接表中的行,它有另一个与之相关的表,我也想删除与此ID相关的所有行。看起来像下图。当我使用会话时。使用hibernate删除(reqCandObject)它工作正常,并通过从候选jobReq表中删除一个条目以及相关注释进行级联。但是,我想删除所有具有特定候选ID的候选项(并删除注释)。我尝试了下面的函数,但与nice hibernate不同。删除(对象)函数,此

  • 问题内容: 在Hibernate中删除表中所有行 的最佳方法是什么? 如果我遍历一个集合并称其在我所知范围内没有执行。 如果使用其他选项,则不会影响持久性上下文。 如果没有更好的选择,何时应该使用这些方法? 问题答案: 如果没有什么要层叠的,请使用HQL删除 如果您有层叠,请迭代该集合并分别删除每个集合。 问题出在以下事实:hibernate在内部处理级联,而不是将其留给数据库。因此,发送查询不会