问题标签 [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 投票
2 回答
3333 浏览

hibernate - 在 Hibernate 中使用 CascadeType.ALL 时保存顶级实体会导致对相关实体的不必要更新

有一个带有@OneToMany 映射到另一个实体(CoverArt)的实体类(Song),并将级联设置为ALL,因为只需保存主要实体并让它负责保存封面艺术似乎更容易

但是我稍后在代码中发现,如果我刚刚从数据库中检索类的实例,然后在会话中只修改了 Song 实体中的一个字段,这将导致它更新所有链接到该歌曲的封面艺术实体尽管封面艺术没有任何变化,但为什么要这样做?

此外,我认为这不会导致问题,但我正在使用 Envers,并且(看似)对 CoverArt 表不必要的额外更新具有导致 Envers 创建不必要的审计表的敲击效应。

如果我删除修改一个字段的 CascadeType 注释不会导致更新封面艺术实体并且一切正常,只要我添加额外的逻辑来添加封面艺术,但我希望我不需要做这个。

0 投票
9 回答
22442 浏览

java - 带有 Hibernate 4 和 ManyToOne 级联的 IllegalStateException

我有这两个课

我的项目对象:

组件对象:

我试图坚持使用以下代码:

虽然这适用于 Hibernate 3.6,但 Hibernate 4.1.3 抛出

数据库后端是 h2(但 hsqldb 或 derby 也是如此)。我究竟做错了什么?

0 投票
1 回答
1694 浏览

java - 休眠合并丢失数据

我在使用休眠和合并时遇到了一个奇怪的问题。

有问题的类的结构是这样的:

所以基本上我有一个项目类,其中包含对 CaseWorkerA 的引用,它是 CaseWorker 的子类,它又是 User 的子类。

在代码中:

然后我们有用户层次结构:

然后,在 Dao 类中有一个方法,用于存储项目:

现在,问题如下:

Dao 方法接收一个存在于数据库中的项目。此项目连接到 CaseWorkerA,该 CaseWorkerA 的状态为 CaseWorkerStatus.ACTIVE(在数据库和传入对象中)。但是在合并之后,caseworker 的状态变成了 null。

I really don't get how this is possible, since the value is the same in the database, as in the object to be stored, I would expect it to stay the same after the merge.

(There are no triggers in the database for this field..)

(I am going to try to change the dao-method to use saveOrUpdate instead, but even if this will fix the problem I would still very much like to know what caused it in the first place).

Update:

So I fiddled around with the debugger, and found the following: When I queried the session for the CaseWorker in question, it appeared with it's status-field set (actually, the object returned was exactly the one that was connected to the Project).

Doing a saveOrUpdate, and then a get, resulted in a CaseWorker with the status-field set. So it seems to be a problem with the merge method..

0 投票
1 回答
5110 浏览

java - JPA Cascade注解和Hibernate Cascade注解的区别

我正在尝试使用 Hibernate 注释。当我尝试使用 Cascading 时,我在 Eclipse智能感知中获得了两个选项:

在 hibernate CascadeType中,提供了比 JPA 中的许多选项。

一个比另一个有优势吗?

0 投票
2 回答
2142 浏览

java - 在 Hibernate 中删除父子对象的问题“删除的对象将被级联重新保存”

我有以下两个实体:

1- 交易

2- 交易清单

在这样做session.delete(deal)时,我收到以下错误

请帮忙。

0 投票
1 回答
3885 浏览

java - 在 Hibernate 中删除子对象的问题“已删除的对象将被级联重新保存”

我有以下两个实体:

1- 交易

2- 交易清单

删除子对象时,即 DealCheckList 使用

我收到以下错误

请帮忙。

0 投票
1 回答
813 浏览

hibernate - Hibernate 级联更新到未更改的集合对象

使用 Hibernate 3.3、JPA 1.x 和 Hsqldb 1.8

我在对包含其他对象集合的对象进行级联更新时遇到问题。这是一个人为的(稍微)示例来说明(省略了获取器/设置器)。对不起,它有很多代码,我找不到另一种方式来表达这个问题,而且这里的一切都相当简单。

所以一个推销员对每个公司都有一套联系人,可能有很多个为一个公司服务的推销员,每个人都有不同的联系人。我可以为推销员添加一个新公司(和相关联系人),一切都很好。

将新公司(和联系人)添加到已经拥有以下公司的推销员时会出现问题:

当使用 hibernate.show_sql=true 运行它时,我可以看到这具有为每个联系人运行插入并为新的 ContactSet 插入的预期效果。我还看到了销售员本身的更新,以及有关销售员拥有的所有其他 ContactSet 和 Contact 的更新。由于每个业务员有数千个联系人,因此此交易需要很长时间。

我的问题是,如何避免我知道没有更改的 ContactSets 和 Contacts 的所有更新?我已经尝试添加 @Version 标签,更改 CascadeType(在我的应用程序中除了 ALL 之外的任何东西都失败了)并加载了更具体的代码修补,但没有成功!

在此先感谢您的任何指点,

**编辑:发现添加 session.lock(salesman, LockMode.NONE) 到事务意味着其他对象没有得到更新,但代码仍然很慢。我怀疑是因为它仍在向会话中添加数千个对象以锁定它们。更新了示例代码以反映这一点。LockMode.NONE 只是将分离的对象与会话重新关联。

菲尔

0 投票
1 回答
2990 浏览

hibernate - Hibernate 更新后从多对多关联表中删除记录

在我的面向团队合作的应用程序中,我在用户和团队之间有多对多的关系,所以休眠创建关联表。问题是,在更新拥有 Team 的 User 后,hibernate 会从 USER_TEAM 表中删除相应的关联记录。

用户实体:

团队实体:

这是日志:

信息:20.11.2012 22:50:00,170 调试 org.hibernate.transaction.JDBCTransaction.begin:开始
信息:20.11.2012 22:50:00,175 调试 org.hibernate.transaction.JDBCTransaction.begin:当前自动提交状态:true
信息: 20.11.2012 22:50:00,175 调试 org.hibernate.transaction.JDBCTransaction.begin:禁用自动提交
信息:20.11.2012 22:50:00,175 调试 hibernate.jdbc.util.SQLStatementLogger.logStatement:选择 user_.EMAIL,user_.GROUPNAME作为 GROUPNAME0_,user_.NAME 作为 NAME0_,user_.PASSWORD 作为 PASSWORD0_ 来自 USERS user_ where user_.EMAIL=?
信息:休眠:从用户 user_ 中选择 user_.EMAIL,user_.GROUPNAME 作为 GROUPNAME0_,user_.NAME 作为 NAME0_,user_.PASSWORD 作为 PASSWORD0_,其中 user_.EMAIL=?
信息:20.11.2012 22:50:00,176 TRACE type.descriptor.sql.BasicBinder.bind:绑定参数 [1] 作为 [VARCHAR] - a@b.com
信息:20.11.2012 22:50:00,177 TRACE type.descriptor .sql.BasicExtractor.extract:发现 [users] 作为列 [GROUPNAME0_]
信息:20.11.2012 22:50:00,178 TRACE type.descriptor.sql.BasicExtractor.extract:发现 [default] 作为列 [NAME0_]
信息:20.11。 2012 22:50:00,178 TRACE type.descriptor.sql.BasicExtractor.extract:发现 [默认] 作为列 [PASSWORD0_]
信息:20.11.2012 22:50:00,251 调试 org.hibernate.transaction.JDBCTransaction.commit:提交
信息: 20.11.2012 22:50:00,252 调试 hibernate.jdbc.util.SQLStatementLogger.logStatement:更新用户设置 GROUPNAME=?,NAME=?,PASSWORD=? EMAIL=?
信息:休眠:更新用户集 GROUPNAME=?、NAME=?、PASSWORD=? EMAIL=?
信息:20.11.2012 22:50:00,260 TRACE type.descriptor.sql.BasicBinder.bind:绑定参数 [1] 作为 [VARCHAR] - 用户
信息:20.11.2012 22:50:00,261 TRACE type.descriptor.sql.BasicBinder .bind:绑定参数 [2] 作为 [VARCHAR] - andy
INFO:20.11.2012 22:50:00,261 TRACE type.descriptor.sql.BasicBinder.bind:绑定参数 [3] 作为 [VARCHAR] - 中断
信息:20.11。 2012 22:50:00,262 TRACE type.descriptor.sql.BasicBinder.bind:绑定参数 [4] 作为 [VARCHAR] - a@b.com
信息:20.11.2012 22:50:00,264 调试 hibernate.jdbc.util.SQLStatementLogger .logStatement:从 EMAIL=? 的 USER_TEAM 中删除
信息:休眠:从 EMAIL=? 的 USER_TEAM 中删除
信息:20.11.2012 22:50:00,271 TRACE type.descriptor.sql.BasicBinder.bind:绑定参数 [1] 作为 [VARCHAR] - a@b.com

信息:20.11.2012 22:50:00,274 调试
org.hibernate .transaction.JDBCTransaction.toggleAutoCommit:重新启用自动提交信息:20.11.2012 22:50:00,274 DEBUG org.hibernate.transaction.JDBCTransaction.commit:提交的 JDBC 连接

更新操作由spring的hibernateTemplate在UserDAO中这个简单的方法中提供:

(我知道不应该使用 hibernateTemplate,但我认为这不是这个问题的重点)

而DAO方法在事务中被spring service bean UserServiceImpl简单地调用:


如您所见,我没有任何级联注释,并且在更新中我当然不会更改用户的 PK (EMAIL),所以我不理解这种行为。我正在使用 spring 3.1.0.RELEASE 和休眠 3.6.10.Final。

感谢您的任何建议或解释。

0 投票
1 回答
929 浏览

java - 一对一删除:Hibernate 3 + Spring 3 + PostgreSQL 9.1

这是我的第一篇文章,我是 Hibernate + Spring 的新手。我在 applicationContext.xml 文件中使用 XML 进行 Hibernate 映射声明。

简而言之,我正在尝试做:

希望它会删除孩子。但它不起作用。:(

相反,我有这个例外:

引起:在 org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:232) 在 org.hibernate.engine.EntityEntry.getLoadedValue(EntityEntry.java:255) 在 org.hibernate.engine.Cascade 的 java.lang.NullPointerException .cascade(Cascade.java:161) 在 org.hibernate.engine.Cascade.cascade(Cascade.java:127) 在 org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:376) 在 org.hibernate。 event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:350) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246) at org.hibernate.event.def.DefaultUpdateEventListener.performSaveOrUpdate(DefaultUpdateEventListener.java: 57) 在 org.hibernate.event.def。DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireUpdate(SessionImpl.java:742) at org.hibernate.impl.SessionImpl.update(SessionImpl.java:730) at org.hibernate.impl .SessionImpl.update(SessionImpl.java:722) at org.springframework.orm.hibernate3.HibernateTemplate$14.doInHibernate(HibernateTemplate.java:708) at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)在 org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 在 org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:705) 在 org.springframework.orm.hibernate3.HibernateTemplate.update (HibernateTemplate.java:701) 在 fr.gouv.travail.gestionAccords.server.dao。implementations.DossierDAOImpl.update(DossierDAOImpl.java:163) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl。 java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) 在 org.springframework.aop.framework.ReflectiveMethodInvocation .invokeJoinpoint(ReflectiveMethodInvocation.java:183) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 在 org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 在 org. springframework.aop。framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) at $Proxy38.update(Unknown Source) at fr.gouv.travail.gestionAccords.server .business.gestionDossiers.detailsDossier.commons.implementations.DetailsDossierBusinessImpl.update(DetailsDossierBusinessImpl.java:396)

我已经看到我必须delete-orphan在我的 XML 映射文件中声明,但这让我抓狂,因为它不想工作。你能看看有什么问题吗?

因此,在我当前的项目中,我有一个一对一的关系:这是我为名为DossierBean的父级的 XML 映射。

档案Bean.hbm.xml

TravailleurHandicapeBean.hbm.xml

DossierBean.java(父 bean)

TravailleurHandicapeBean.java(子豆):

谢谢你的帮助!

没有答案?感谢您的贡献...

0 投票
0 回答
645 浏览

java - Hibernate 级联合并与非持久对象

我的项目中有以下结构:

然后,在一个场景中,我有一个分离的 A 对象,引用了一个分离的 B 对象,而 B 对象又引用了一个分离的 C 对象,它引用了几个 D 对象。(我使用的是 JMS,所以它们真的很分离)。像这样:

现在,分离的 A 将与 A 的数据库表示合并,对于 B 和 C 也是如此,但是从 C 到 D 的新引用会发生什么?我在实践中看到它不起作用,c_d 连接表中没有存储任何内容,但我不明白为什么。是由于 Hibernate/JPA 的限制,还是我的配置遗漏了什么?

更新:

通过使用调试器,我能够在 C 对象上显式地 getSession().merge(),然后它对 D 的引用被存储在数据库中。仍然不太明白为什么 Hibernate 级联不会为我处理这个问题,但会继续挖掘。