问题标签 [hibernate-cascade]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1175 浏览

java - 休眠中@EmbeddedId 内的级联

我正在添加一个包含附加数据的交集表,并使用@EmbeddedId为受此表中的记录绑定的实体(entity1entity2)创建一个复杂的 ID。

当我保存实体 1 时,我想通过级联保存所有数据。所以,这就是为什么在实体 1 中我有:

在 Entity1ToEntity2Link 我有 @EmbeddedId 并且在其中我有两个实体的链接。但是,我希望在保存实体 1 时保存第二个。所以,我这样做了:

但是,不幸的是,我在@EmbeddedId 中的级联似乎被忽略了。我可以看到没有生成用于插入的 sql,并且在保存 Entity1ToEntity2Link 时出现错误:

违反 - 未找到父键

我怀疑 @EmbeddedId 不支持级联。但是,我不确定。在保存 Entity1ToEntity2Link 之前,您有什么想法可以保存 entity2 吗?


标识对象:

0 投票
1 回答
249 浏览

java - 如果我们在保存之前调用 iterator(),则使用 CascadeType.ALL 在 OneToMany 上休眠 TransientObjectException

我在休眠中有 OneToMany 关系,如下所示:

简化的场景是我从数据库中加载一个对象Container(容器)并尝试像这样添加一个:Itemcontainer.items

一切顺利。但就我而言,我想遍历项目并检查一些东西,但是当我像这样调用container.getItems().iterator并保存时container

我收到以下错误

org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例 - 在查询刷新之前保存瞬态实例:mypackage.items

我不知道为什么会发生此异常。

0 投票
0 回答
382 浏览

hibernate - 尽管我使用了 cascadeType.all,但在删除父级时获取约束违规异常

根据我的要求,我有两个与@onetomany 映射关联的实体公司和联系人,我想删除公司及其相关联系人。我已经使用了 Cascade.All,但每当我尝试删除公司时,我仍然会遇到约束违规异常。

模型 :

我收到以下异常:

错误 SqlExceptionHelper:146 - 错误:更新或删除表“公司”违反了表“联系人”上的外键约束“fk_6jbjhtdw6ak2in3ln4tlxm0dm”详细信息:键 (id)=(71) 仍从表“联系人”中引用。org.hibernate.exception.ConstraintViolationException:无法在 org.hibernate.exception.internal.SQLStateConversionDelegate.convert 执行语句(SQLStateConversionDelegate.java:129)

0 投票
0 回答
366 浏览

java - 弹簧数据 JPA。Hibernate 5. 条件多对多级联处理

有很多信息和示例如何使用@ManyToMany,这部分总体上很清楚。我还没有找到适合我的案例的优雅解决方案。我知道如何使用变通方法,但我希望任何人都知道并可以分享应该使用的优雅解决方案或想法..

收入明细:

账户

日历有关

多对多。_

特殊限制

加载帐户信息我想访问所有映射的日历(对于该帐户),但我不想通过该帐户访问映射在任何已访问日历上的所有帐户。我需要模拟一些特殊行为的情况:

  1. 用户加载帐户我有兴趣访问相应的日历集合。
  2. 以下1.通过日历我只需要知道Account (对于当前用户,如果Calendar与其他Account有很多关系并不重要)。
  3. 删除Account所有Calendar应该被级联删除。
  4. 如果它是日历的最后一个帐户,则应在帐户删除时间激活日历的级联删除
  5. 将日历添加到帐户所有日历应以级联方式添加。
  6. 5.限制只应为之前为其他Account保留的日历添加链接。

问题

我可以在 Spring 服务中实现所有这些案例处理程序。但我相信这个问题可以在休眠级别解决,并且我相信必须以最优雅的方式实现该解决方案。因此,请帮助我处理或建议我以最佳方式管理这种情况(一些休眠注释或其他工具)。

0 投票
1 回答
34 浏览

spring - In-Memory 和 MySQL DB 的不同持久性行为

我有一个父实体和一个具有一对多关系的子实体。

使用@DataJpaTest(即配置内存数据库)时,以下内容按预期工作:

它正确地插入了路线和每个孩子,我可以稍后获取路线并获取相同的信息。

但是,当我在使用真实数据源(本地 MySQL 数据库)的同时在服务中重复此操作时,似乎没有发生 CASCADE.ALL 持久化,我最终没有插入停靠点,但路由被持久化并分配了一个ID。

我已经通过在配置双向关系的父级中使用“addEntity”方法来遵循站点周围的建议,但它在测试套件之外不起作用。

有谁知道这可能是为什么?

0 投票
1 回答
228 浏览

hibernate - 创建新实体与修改现有实体时persist() 的级联行为

我试图理解为什么persist() 的行为在ManyToOne 上是不同的,首先是持久化一个新实体,其次是修改该实体。我的测试设置让 Employee 与 Department 有一个单向的 ManyToOne;部门与员工之间没有关系。对于测试,我在 Employee 的 Department 字段上没有任何级联注释。

我发现在创建 Employee 时,我必须调用 em.persist(dept) 否则 dept 实例不会被持久化并且我得到一个异常。所以,我正在调用 em.persist(dept) 以便保留 dept 实体。我的下一个测试是提交并开始一个新事务,使用 em.find() 检索员工实体,修改 dept.name,然后持久化员工。我发现,尽管 Employee 的 Department 字段上没有任何级联注释,但对 dept 的更改仍然存在。

为什么是这样?为什么对部门的更改会持久化(通过 em.persist(emp))到数据库,而部门上没有任何级联,但是当员工第一次持久化时,部门的创建不会持久化?我错过了什么?顺便说一句,为了清楚起见,在测试结束时,对部门名称(进一步数学)的更改仍然存在。谢谢。

编辑我刚刚在https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate上读到“您可以在已经持久化的实例上调用此方法 (persist()),但什么也没有发生” 。我认为这意味着在 changeDept() 中我在 find() 之后对 persist() 的调用是多余的,所以我删除了它,结果是一样的。所以这让我想到除了许多误解之外,其中一个可能是我对persist()的理解,以及它如何与将实体(及其相关实体)的状态变化传播到数据库相关或不相关。但是,Department 上仍然没有 cascadeType 注释。

EDIT2我想我到了某个地方。我添加了一个新方法,它创建一个新部门(“ENGLISH”),像以前一样使用 find() 检索员工,将员工的部门设置为新部门,然后提交。我得到(谢天谢地,正如预期的那样)一个例外:

java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing

如果我将 PERSIST cascadeType 放在 Department 字段上,则不会发生此异常。所以显而易见的是,持久化适用于新实体的持久化;它不适用于将更改传播到现有实体。问题仍然存在,将更改传播到相关实体是否是默认行为(即没有指定任何 cascadeType)?我想一定是的。

部门:

方法:

0 投票
1 回答
2031 浏览

spring - 使用 Spring Data JPA - 如何在保存父实体和使用 CascadeType=PERSIST 的同时仅保存子实体中的唯一项目

我正在准备简单的 Spring 应用程序。我有 2 个实体:Book.class(父)和 Author.class(子):来自 Author 视图的 @OneToMany 和来自 Book 视图关系的 @ManyToOne(cascade=CascadeType.PERSIST)。在保存新书的同时——作者也被保存并添加到数据库(mySql)中——这就是我想要的。但我不明白为什么 Spring 添加作者 - 如果这样的项目已经存在。如何更改代码以确保只有唯一的作者将添加到数据库中,并且数据库中的作者表中不会有重复

我已经向 Author 类添加了 hashCode 和 equals 方法,但它没有帮助。我也尝试更改 Cascade.Type 但也没有帮助。

Author.class(部分代码):

和 Book.class(部分代码):

编辑 1 BookServiceImpl.class

AuthorServiceImpl.class

和 BookWebController.class

任何提示都会非常有用,因为我对这个领域很陌生:-)

0 投票
1 回答
1785 浏览

sql - 休眠:一对多关系的级联删除问题

我有以下实体模型。

我想删除产品,并且该删除还应删除与该产品相关的所有 ProductAddon 实体。所以我声明了与所有级联类型的一对多关系。但是当我尝试删除某些产品时,Hibernate 一开始会尝试在 product_addon 表中设置 null addon_id。但是该列具有非空约束,因此删除失败。

所以我添加到注释@ManyToOne 参数

但是现在休眠只是尝试删除产品,然后再删除与该产品相关的 product_addon 实体。由于外键约束,此删除失败(无法删除或更新父行:外键约束失败)。

这里有什么问题?此应用程序还使用 liquibase,因此外键不是由 hibernate 生成的。例如,addon_id 的外键没有删除操作,但我认为休眠不需要这些操作,因为它适用于更高的数据层

0 投票
0 回答
60 浏览

mysql - 删除父行而不影响休眠中的子行

我在@Manytomany 休眠关系中的代码有问题。

我看到上述问题是由于@ManyToMany 关系方面的“CascadeType.ALL”。但是如果我在@ManyToMany 中删除这个 CascadeType.ALL。如果我用 CascadeType.PERSIST 和 CascadeType.MERGE 更改 @ManyToMany 中的 CascadeType.ALL,我可以解决问题。但是当我添加新对象时会出错。否则,如果我将其更改为 CascadeType.ALL,则在添加新对象时它可以正常工作,但它不能解决我正在讨论的问题。那么如何在删除 Post 中的行时保留 Class Tag 中的行。

//

正如我上面所说,如果它是 CascadeType.ALL,当我在 Post 中删除一行时,我将无法在 Tag 中保留该行,当我写它是 CascadeType.PERSIST 和 CascadeType.MERGE 我得到一个错误:对象引用了一个未保存的瞬态instance - 在刷新之前保存瞬态实例。

这是我的输入 API 对象:

请记住,当我使用 Casecade.ALL 时,api 输入工作正常

0 投票
1 回答
64 浏览

spring - 如何级联删除单向

我有一个案例,我有一个用户,而用户有一个EmailVerificationToken.

我想EmailVerificationToken在用户被删除时删除。

但是,由于EmailVerificationToken是一个仅在短时间内需要的对象(即仅使用一次并且之后无关紧要),因此我不希望User实体包含令牌。相反,我希望EmailVerificationToken引用它所属的用户,而不是相反。

如何设置它,以便当我删除用户时,EmailToken即使它没有在User实体中引用它,它也会删除它?

这是我目前的代码: