休眠异常:分离的实体传递给持久化[重复]
Posted
技术标签:
【中文标题】休眠异常:分离的实体传递给持久化[重复]【英文标题】:Hibernate Exception : detached entity passed to persist [duplicate] 【发布时间】:2013-11-05 19:08:29 【问题描述】:我正在尝试使用 Hibernate EntityManager persist 方法将人 pojo 插入 mysql db,
entityManagerTransactionService.getEntityManager().persist(TemplateObject);
得到这个异常,
javax.persistence.PersistenceException:
org.hibernate.PersistentObjectException: detached entity passed to
persist: com.esupu.base.model.pojo.common.TitleType at
org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)....
还有更多..
Caused by: org.hibernate.PersistentObjectException: detached entity
passed to persist: com.esupu.base.model.pojo.common.TitleType at
org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)
at
org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:843)
我的 Person.java 类是,
@Entity
public class Person extends TemplateObject
@OneToOne(cascade = CascadeType.MERGE, CascadeType.PERSIST,CascadeType.REFRESH )
private TitleType titleType;
private String middle;
private String last;
@OneToOne(cascade = CascadeType.ALL )
private Address address;
private Date birthdate;
private String email;
private String telephone;
private String fax;
@OneToOne(cascade = CascadeType.ALL )
private Location location;
@OneToOne(cascade = CascadeType.ALL )
private Country country;
然后是 pojo 的 getter setter 方法 ..
错误抛出 TitleType 类是“公共静态最终”标题类型定义提供程序,
@Entity
public class TitleType extends TemplateObject
/**
*
*/
private static final long serialVersionUID = 3104954552111621034L;
private TitleType(int id, String name)
setId(id);
setName(name);
public static final TitleType MR = new TitleType(1, "Mr");
public static final TitleType MISS = new TitleType(2, "Miss");
public static final TitleType MRS = new TitleType(3, "Mrs");
public static final TitleType MS = new TitleType(4, "Ms");
public static final TitleType DOCTOR = new TitleType(5, "Doctor");
public static final TitleType PROFESSOR = new TitleType(6, "Professor");
public static final TitleType SIR = new TitleType(7, "Sir");
public static final TitleType MADAM = new TitleType(8, "Madam");
我将标题类型类设置为人,
person.setTitleType(TitleType.MR);
是否不可能将公共静态最终类型定义的类传递给 Hibernate?还是我做错了什么?
提前致谢
【问题讨论】:
向我们展示持久化对象的代码。您似乎正在尝试保留一个分离的对象 【参考方案1】:您尝试保留的对象包括不应具有ID
值的TitleType
。否则,Hibernate 将检查该对象是否在会话上下文中是持久的或分离的。如果您不想像这样持久化对象的某些字段,则可以在持久化实体时使用 @Transient
注释将这些字段从字段映射中排除。这对 DAO 或实体中的 ID 进行硬编码并不好,因为这些值可能由某些生成器生成,但如果您使用此常量手动更新数据库,您至少可以在代码中将这些 ID 定义为常量,并按 ID 从会话中加载对象在初始化瞬态或持久实例之前。
【讨论】:
【参考方案2】:不要这样做:public static final TitleType MR = new TitleType(1, "Mr");
您应该使用 EntityManager 来获取该对象。否则 Hibernate 会注意到,这个 Object(id 为 1)已经被存储了,但是由于你没有加载它,实体管理器没有在它自己的集合中拥有它 -> 这是一个分离的实体。
所以,你应该这样做:
TitleType MR = em.find(TitleType.class, 1);
Person p = new Person(...);
p.setTitleType(MR);
em.merge(p);
【讨论】:
我测试并发现您的答案也正确,但我选择按照 nikpon 的建议从 TitleType DAO 中删除 id,所以我不得不选择他的答案作为接受的答案,非常感谢您的帮助为你们俩:) 这是一种肮脏的方法,因为它将控制器级代码与持久层代码混合在一起。 @CodeMed 不,不是。这个例子很短,是的,但这是要走的路。如果要向group
添加新的user
,还需要加载 现有组,添加新用户,最后将更改刷新到数据库而不触及现有组.以上是关于休眠异常:分离的实体传递给持久化[重复]的主要内容,如果未能解决你的问题,请参考以下文章
JPA:传递给持久化的分离实体:嵌套异常是 org.hibernate.PersistentObjectException
PersistentObjectException:分离的实体传递给持久化-第二次运行方法时出现此异常
org.hibernate.PersistentObjectException:传递给持久化的分离实体:多对一单向
PersistenceException:传递给持久化的分离实体