如何在 Hibernate 3.6 中正确级联保存主键上的一对一双向关系

编程入门 行业动态 更新时间:2024-10-20 03:24:31
本文介绍了如何在 Hibernate 3.6 中正确级联保存主键上的一对一双向关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我与共享密钥建立了一对一的双向实体关系.当我尝试保存关联的所有者时,我收到针对关系拥有方的生成空 ID"异常.我正在使用 hibernate-entitymanager 并使用 spring 进行事务管理.

I have an one-to-one, bidirectional entity relationship with shared keys. When I attempt to save the owner of the association I get a "null id generated" exception against the owned side of the relationship. I am utilizing hibernate-entitymanager and using spring for transaction management.

拥有实体

@Entity @Table(name = "lead") public class Lead { private Long leadId; private LeadAffiliate leadAffiliate; @Id @GeneratedValue(strategy = GenerationType.AUTO) public Long getLeadId() { return leadId; } @OneToOne(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn public LeadAffiliate getLeadAffiliate() { return leadAffiliate; } }

拥有的实体

@Entity @Table(name = "lead_affiliate") public class LeadAffiliate { private Long leadId; private Lead lead; @Id public Long getLeadId() { return leadId; } @MapsIdmappedBy = "leadAffiliate") @OneToOne(cascade = CascadeType.All) @PrimaryKeyJoinColumn @JoinColumn(name = "lead_id") public Lead getLead() { return lead; } }

下面的代码用于保存实体:

and the code below is being used to save the entity:

LeadAffiliate aff = new LeadAffiliate(); aff.setLead(lead); lead.setLeadAffiliate(aff); em.persist(lead);

这一切在 hibernate 3.5.0-Final 中都运行良好.尝试升级到 3.5.6-Final 或 3.6.0.Final 时,我开始收到为 LeadAffiliate 生成的 null id"错误:

This all works perfectly fine in hibernate 3.5.0-Final. When attempting to upgrade to 3.5.6-Final or 3.6.0.Final is when I start getting the "null id generated for LeadAffiliate" error:

javax.persistence.PersistenceException: org.hibernate.id.IdentifierGenerationException: null id generated for:class com.sellingsource.bizdev.entities.LeadAffiliate at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147) at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153) at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:678) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:365) at $Proxy152.persist(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) at $Proxy120.persist(Unknown Source) at com.sellingsourcemon.dao.JpaGenericDao.create(JpaGenericDao.java:38) ... 64 more Caused by: org.hibernate.id.IdentifierGenerationException: null id generated for:class com.sellingsource.bizdev.entities.LeadAffiliate at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:123) at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69) at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179) at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135) at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:799) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:791) at org.hibernate.engine.EJB3CascadingAction$1.cascade(EJB3CascadingAction.java:48) at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) at org.hibernate.engine.Cascade.cascade(Cascade.java:161) at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:450) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:282) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129) at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69) at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179) at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135) at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61) at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:808) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:782) at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:786) at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:672) ... 77 more

顺便说一句,我不确定关于 Lead Affiliate 的注释是否完全正确.他们工作了,但似乎有点笨拙.所以我已经将它们更改为:

As an aside, I am not sure that the annotations on Lead Affiliate were quite right to begin with. They worked, but seemed kind of kludgey. So I have since changed them to:

@Entity @Table(name = "lead_affiliate") public class LeadAffiliate { private Long leadId; private Lead lead; @Id @GenericGenerator(name = "foreign", strategy = "foreign", parameters = { @org.hibernate.annotations.Parameter(name = "property", value="lead") }) @GeneratedValue(generator = "foreign") public Long getLeadId() { return leadId; } @OneToOne(mappedBy = "leadAffiliate") @PrimaryKeyJoinColumn public Lead getLead() { return lead; } }

但是,通过这些更改,我得到了相同的结果.(适用于 3.5.0 但不适用于 3.5.6 或 3.6.0)

However, with these changes I get the same result. (Works in 3.5.0 but not 3.5.6 or 3.6.0)

我需要用一种新的方法来做这件事还是这是一个错误?我担心的是我的代码目前正在运行,因为一个错误:/.

Is there a new way I need to be doing this or is this a bug? My concern is that my code is currently working because of a bug :/.

推荐答案

规范说派生实体应该是关系的拥有方:

Specification says that derived entity should be the owning side of the relationship:

2.4.1 派生身份对应的主键

一个人的身份实体可能来自另一个实体的身份(父母"实体)当前者实体(依赖"实体)是多对一或一对一的所有者与母公司的关系和外键映射关系从受抚养人到父母.

The identity of an entity may be derived from the identity of another entity (the "parent" entity) when the former entity (the "dependent" entity) is the owner of a many-to-one or one-to-one relationship to the parent entity and a foreign key maps the relationship from dependent to parent.

在你的情况下 LeadAffiliate 是派生的,所以它应该是所有者,当 Lead 应该被 mappedBy 标记为非拥有方时.以下适用于 3.5.0 和 3.5.6:

In your case LeadAffiliate is derived, so it should be the owner, when Lead should be marked as non-owning side by mappedBy. The following works in both 3.5.0 and 3.5.6:

public class Lead { @Id @GeneratedValue private Long leadId; @OneToOne(cascade = CascadeType.ALL, mappedBy = "lead") private LeadAffiliate leadAffiliate; ... }

.

public class LeadAffiliate { @Id private Long leadId; @OneToOne @MapsId private Lead lead; ... }

更多推荐

如何在 Hibernate 3.6 中正确级联保存主键上的一对一双向关系

本文发布于:2023-10-14 22:11:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1492364.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:双向   主键   正确   关系   级联

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!