传递给持久化的分离实体:JPA 继承

Posted

技术标签:

【中文标题】传递给持久化的分离实体:JPA 继承【英文标题】:detached entity passed to persist: JPA inheritance 【发布时间】:2015-01-12 10:05:54 【问题描述】:

我有一个继承自 Vehicle 的 Bus 类。这是一个 JPA 单表继承(鉴别器列是 TYPE : "B" for bus)。 当我尝试坚持总线时,我收到此错误。 可能是什么原因?谢谢

Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: org.enseirb.it307.tp.entities.VehicleStatus
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:139)
    at org.hibernate.internal.SessionImpl.firePersistOnFlush(SessionImpl.java:838)
    at org.hibernate.internal.SessionImpl.persistOnFlush(SessionImpl.java:831)
    at org.hibernate.engine.spi.CascadingActions$8.cascade(CascadingActions.java:357)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:350)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:293)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)
    at org.hibernate.engine.internal.Cascade.cascadeCollectionElements(Cascade.java:379)
    at org.hibernate.engine.internal.Cascade.cascadeCollection(Cascade.java:319)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:296)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:161)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:118)
    at 

导致错误的代码:

//Bus
Bus bus1 = BusTools.getSampleBus1();
createdToulouseOrg.addVehicle(bus1);
logger.info("insert Bus " + bus1);
Vehicle createdBus1 = vehicleDao.insertVehicle(bus1);

insertVehicle 方法使用 entitymanager.persist

@Override
public Vehicle insertVehicle(Vehicle vehicle) 

    entityManager.getTransaction().begin();
    entityManager.persist(vehicle);
    entityManager.getTransaction().commit();
    return vehicle;

【问题讨论】:

请向我们展示导致此错误的代码。 我添加了导致错误的代码 不,这是对你的 DAO 的调用,而不是实际的持久化。 我添加了dao代码 createdToulouseOrg.addVehicle(bus1) 是做什么的? 【参考方案1】:

根据日志,Vehicle 包含与一个或多个 VehicleStatus 实体的关联。

由于persist操作也级联到VehicleStatus,所以给出了“传递给persist的分离实体”错误。

最简单的解决方法是调用merge 而不是persist

@Override
public Vehicle insertVehicle(Vehicle vehicle) 

    entityManager.getTransaction().begin();
    vehicle = entityManager.merge(vehicle);
    entityManager.getTransaction().commit();
    return vehicle;

【讨论】:

以上是关于传递给持久化的分离实体:JPA 继承的主要内容,如果未能解决你的问题,请参考以下文章

JPA:传递给持久化的分离实体:嵌套异常是 org.hibernate.PersistentObjectException

带有 JPA/EJB 代码的“分离实体传递给持久错误”

Spring Data JPA:一对一实例化问题:PersistentObjectException:分离实体传递给持久化

Hibernate - 已经持久化的孩子的“分离实体传递给持久化”错误

传递给持久化的休眠分离实体

PersistenceException:传递给持久化的分离实体