传递给持久化的分离实体:JPA 继承
detached entity passed to persist: JPA inheritance
我有一个继承自 Vehicle 的 class 总线。这是一个 JPA Single table 继承(鉴别器列是 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.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;
}
根据日志,车辆包含与 VehicleStatus
个或多个实体的关联。
出现'detached entity passed to persist'错误是因为persist操作也级联到VehicleStatus
。
最简单的解决方法是调用 merge
而不是 persist
:
@Override
public Vehicle insertVehicle(Vehicle vehicle) {
entityManager.getTransaction().begin();
vehicle = entityManager.merge(vehicle);
entityManager.getTransaction().commit();
return vehicle;
}
我有一个继承自 Vehicle 的 class 总线。这是一个 JPA Single table 继承(鉴别器列是 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.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;
}
根据日志,车辆包含与 VehicleStatus
个或多个实体的关联。
出现'detached entity passed to persist'错误是因为persist操作也级联到VehicleStatus
。
最简单的解决方法是调用 merge
而不是 persist
:
@Override
public Vehicle insertVehicle(Vehicle vehicle) {
entityManager.getTransaction().begin();
vehicle = entityManager.merge(vehicle);
entityManager.getTransaction().commit();
return vehicle;
}