问题标签 [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 回答
6911 浏览

java - 休眠一对多添加新孩子

我已经阅读了很多关于类似问题的文章和答案,但我仍然无法理解。

这是我的父类:

在这里我们可以看到两组 - 项目和用户的朋友。

UserItemId 类的示例:

现在我正在尝试向用户添加新项目:

但我得到一个错误:

org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

我知道主要问题出在 CascadeTypes - ALL 它不是最好的变体,因为休眠不能做我想要的 - 了解 User 是一个持久对象,只需添加到持久新项目并将其保存到数据库。所以我想问你,当我有父类(用户)和子类(项目)并且我想添加新项目并从父级删除项目并将其保存到数据库时,在这种情况下获胜的最佳做法是什么。确实我找到了工作方法(使用迭代器),但我知道在高负载项目中,它是此类操作的最糟糕的变体循环。我真的很想为这种情况找到最佳实践。

问题更新: 我犯了错误。当我调用执行将子元素添加到集合的代码时(上面的代码)-一切都很好-在数据库和实体中添加了子元素,但是当我尝试删除子元素时:

然后我得到了异常:

org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

另一个更新:

经过大量实验后,我得到了添加项目的工作代码:

它是服务层中向用户添加项目的方法代码。它正在工作。而且我有一半工作代码可以从用户那里删除项目:

它不是正常工作的代码。我们有一个情况 - 用户有 3 个项目。我删除了一项 - 一切都很好。后来我试图再删除一项,hibernate 告诉我:

ObjectNotFoundException:不存在具有给定标识符的行

这意味着在缓存中仍然有 3 个项目 - 我首先删除的一个 - 仍然在缓存中,并且休眠尝试将其添加到数据库中 - 但它被删除了。

我又多了一个想法,可以帮助我们回答这个问题。对象用户 - 我试图删除孩子 - 它是从 SecurityContext 登录的用户 - 我从控制器得到它 - 控制器有注释用户从安全获得的位置。因此,hibernate 已经在缓存中记录了用户(用户对象)。有任何想法吗?

0 投票
1 回答
1253 浏览

spring - Spring存储库级联

我正在使用 Spring Data 存储库来保存我的实体,但由于某种原因,级联不适用于测试 saveCountryAndNewCity() :城市没有得到保存,但它适用于类似的 saveCityAndNewCountry()。有人可以帮我弄清楚为什么吗?谢谢。

0 投票
1 回答
2335 浏览

java - Hibernate OnDelete Cascade 不适用于 MySql 但适用于 postgres 和 Ms-Sql

我有 2 个实体。使用来自Post->Thread的 OnetoOne 映射的Thread实体和Post实体。

一个Thread实体包含许多Posts。我知道我应该使用 OnetoMany 而不是 OnetoOne,但是为了避免所有集合问题,我正在使用 OnetoOne

现在的问题是,当我删除一个Thread时,与之关联的所有帖子也必须被删除。我通过使用成功地做到了

但它仅适用于 Postgres 和 Ms-SQl,但不适用于 MySql(也尝试过 InnoDb)。模式生成查询中不会生成on delete 级联。

以下是代码


使用以下查询从Thread实体中删除项目时出现以下错误

2014 年 9 月 2 日晚上 8:33:51 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 警告:SQL 错误:1451,SQLState:23000 2014 年 9 月 2 日晚上 8:33:51 org.hibernate.engine.jdbc。 spi.SqlExceptionHelper logExceptions 错误:无法删除或更新父行:外键约束失败(forumpost_tbl,CONSTRAINT FK_bfbv5nknqj7ppd5630scimhtbFOREIGN KEY(ThreadID_thread_id)参考thread_tblthread_id)) org.hibernate.exception.ConstraintViolationException:无法在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java: 49) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 在 org.hibernate.engine 的 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) .jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:136) 在 org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:58) 在 org.hibernate.persister.entity.AbstractEntityPersister.delete (AbstractEntityPersister.java:3343) 在 org.hibernate.persister。entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:3546) 在 org.hibernate.action.internal.EntityDeleteAction.execute(EntityDeleteAction.java:100) 在 org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:377)在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:369) 在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:293) 在 org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions (AbstractFlushingEventListener.java:339) 在 org.hibernate.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) 在 org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1234) 在 org.hibernate.internal。 org.hibernate.engine.transaction.internal.jdbc 上的 SessionImpl.managedFlush(SessionImpl.java:404)。JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) at test.main(test.java:84) 原因:com.mysql.jdbc .exceptions.jdbc4.MySQLIntegrityConstraintViolationException:无法删除或更新父行:外键约束失败(forum. post_tbl, 约束外FK_bfbv5nknqj7ppd5630scimhtb键 ( ThreadID_thread_id) 参考thread_tbl(thread_id)) HibernateException:无法在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 的 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 处执行语句在 java.lang.reflect.Constructor.newInstance(Constructor.java:408) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.Util.getInstance(Util.java:386 ) com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040) com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120) com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java: 4052) 在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503) 在 com.mysql.jdbc.MysqlIO。com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2794) 在 com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) 在 com.mysql.jdbc.PreparedStatement 的 sqlQueryDirect(MysqlIO.java:2664) .executeUpdate(PreparedStatement.java:2458) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) 在 com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) 在 org.hibernate.engine。 jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) ... 还有 14 个 BUILD SUCCESSFUL(总时间:2 秒)executeUpdate(PreparedStatement.java:2458) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) at org.hibernate.engine.jdbc .internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) ... 还有 14 个 BUILD SUCCESSFUL(总时间:2 秒)executeUpdate(PreparedStatement.java:2458) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) at org.hibernate.engine.jdbc .internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133) ... 还有 14 个 BUILD SUCCESSFUL(总时间:2 秒)

请帮我找到解决办法。

0 投票
1 回答
709 浏览

java - 休眠级联多对多在子引用中创建重复项

好的,所以我是休眠的新手。问题是关于级联多对多,避免添加重复值。所以我按照这个例子。 教程点休眠多对多映射

问题是,如果我运行程序两次,它会将重复值添加到证书表中。

在我将值插入到员工表之后。它级联并将值插入证书表:

在我第二次运行此示例后,它会执行相同的操作。

但是随后证书表具有重复值。值 4-6 与 1-3 相同。

我尝试在表证书上添加唯一约束,但随后出现此错误:

错误:密钥“certificate_name_UNIQUE”的重复条目“PMP”

如何插入值以不重复它们。可以避免这种情况,还是我必须使用其他技术来做到这一点。

如果需要使用 jar,还可以添加 pom.xml。

0 投票
1 回答
1815 浏览

java - org.hibernate.ObjectDeletedException:当集合对象具有一对一关联时,已删除的对象将被级联重新保存

当我尝试从属于 Ticket 类的集合中删除 TicketLine 对象并且 TicketLine 与类 Reservation 具有 OneToOne 关联时,我遇到了“已删除的对象将被级联重新保存”的问题。

Tickets 定义了一个带有以下 getter 的 TicketLines 集合

类 Reservation 定义了与 TicketLines 的 OneToOne 关系,如下所示:

将 TicketLine 对象添加到票证并将 Reservation 对象添加到 TicketLine 对象

按预期工作。正在创建 Reservations 中的记录,其中票证 ID 为 resource_id 字段。

当我从具有关联的 Reservation 对象的集合中删除一行时,我收到以下错误:

仅当存在与该行关联的 Reservation 时才会出现此错误。有趣的是,在新会话中再次尝试不会引发异常,但保留不会被删除!

从 TicketLines 集合中删除一条线路可能发生在许多地方,即手动删除预订并不是一个真正的选择。我希望这可以由 Hibernate 管理,我刚刚对级联选项做错了。

请帮忙。

0 投票
0 回答
135 浏览

java - 无法理解使用休眠删除的 JPA 级联行为

我有三个表/实体,分别是 Event、Participant 和 ParticipantEvent。ParticipantEvent 有点像多对多关系的联接表,但我已将其作为一个实体。映射是这样的。

当我删除一个事件时,休眠不会触发 ParticipantEvent 的删除。在我将 ParticipantEvent -> Participant cascade 给 ALL 之前,它会给出外键约束违规错误。这将在 ParticipantEvent 上触发删除,但也会从 Participant 表中删除数据,但我不想从 Participant 表中删除任何数据。

我在这里迷路了,我认为 ParticipantEvent DML 不应该依赖于 Participant 或 Event。

0 投票
1 回答
1496 浏览

java - 无法从 Hibernate 中的父级集合中删除分离的子级

我有以下具有父子关系的实体:

  1. 我通过将属性复制到具有 ChildDtos 列表的 ParentDto 来检索 Parent 以在 Web UI 上进行编辑。
  2. 完成编辑后,我将 ParentDto 对象发回并将所有属性复制到具有新 HashSet 的新父对象(父对象)中,以存储从 ChildDtos 列表创建的子对象。
  3. 然后我调用 getCurrentSession().update(parent);

问题

我可以添加孩子,更新孩子,但我不能删除孩子。这里有什么问题,我该如何解决?

提前致谢。

0 投票
1 回答
1102 浏览

java - 如何使用 Hibernate 级联删除子项?

我目前的设置类似于:

我省略了一些不必要的字段,因为它们最终没有任何区别。现在解决问题。我想做的是:

我对该函数的期望是从给定容器中物理删除项目,并且由于我将orphanRemoval设置为true,因此当我持久化我的容器时,它实际上确实尝试从数据库中删除该项目。这里的问题在于具有 foreign_key 约束的ItemDetails 实体,因此运行提交时我得到:

对我来说最令人困惑的部分是,当我在数据库的first_item_details表中物理添加ON DELETE CASCADE而不是依靠休眠为我级联时,一切正常。但是这种方法很容易出错,因为如果在某个时候我决定为我的任何详细信息实体使用拦截器eventListener ,它根本不起作用,所以我更愿意让 hibernate 来处理它而不是需要依靠手动数据库结构更改。

0 投票
1 回答
2962 浏览

java - hibernate - 级联类型持续存在多对多关系

我有两个类 Policy 和 Acl。他们有一个多对多的关系。

// 政策

// Acl

现在,当我使用 Cascade 类型作为 persist 时,我收到以下错误:

而当我全部使用级联类型时,它会成功保存策略实体和 acl 实体。我无法理解这是如何发生的。注意:我只是在执行保存操作。

这是主要代码:

0 投票
1 回答
1084 浏览

java - JPA 和 Hibernate 保持 @manytoOne 关系

我有这种情况:

及相关实体

例如在情况下

带有 ProjectLeader_1 的 Project_A 和带有 ProjectLeader_2 的 Project_B

当我尝试将 ProjectLeader_1 添加到 Project_B 时,我也将 ProjectLeader_1 从 Project_A 完全移动到 Project_B,所以我有以下情况:

带有 -No leader- 的 Project_A 和带有 ProjectLeader_2 ProjectLeader_1 的 Project_B

理想的结果应该是:

Project_A 与 ProjectLeader_1 和 Project_B 与 ProjectLeader_2 ProjectLeader_1

以下是为项目分配领导者的方法:

这可能是什么潜在原因?

我是新来的,所以如果其他地方有类似的问题,请给我发一个链接。谢谢你。