【问题标题】:Problems with em.persist on new entity with existing but detached OneToOne entityem.persist 在具有现有但分离的 OneToOne 实体的新实体上的问题
【发布时间】:2012-08-21 10:34:59
【问题描述】:

我在 JBoss AS 7.1 上使用 Hibernate,当我创建新实体并将现有实体设置为 ManyToOne 关系时遇到问题。在使用以下代码之前查询现有实体(客户):

TypedQuery<Customer> query = em.createNamedQuery("Customer.findByLastNameLike", Customer.class);
query.setParameter("lastName", "%"+lastName+"%");
return query.getResultList();

当我在将customer 设置为使用order.setCustomer(customer) 订购后,在新实体order 上执行em.persist(order) 时,会引发以下异常:

Caused by: org.hibernate.PersistentObjectException: detached entity passed to persist: erp.model.persons.Customer
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:717)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:710)
    at org.hibernate.engine.spi.EJB3CascadingAction$1.cascade(EJB3CascadingAction.java:49)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165)
    at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:437)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:266)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:195)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:138)
    at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:78)
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:208)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:151)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:78)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:725)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:701)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:705)
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:853)

实体定义如下:

@Entity
public class Order extends AbstractEntity implements Serializable {

    private static final long serialVersionUID = -8061887078955032972L;

    @ManyToOne(cascade={CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST}, optional = false)
    private Customer customer = null;

@Entity
@DiscriminatorValue("customer")
public class Customer extends Person implements Serializable {

    private static final long serialVersionUID = 2788107135840578322L;

    @OneToMany(cascade=CascadeType.ALL, mappedBy="customer")
    private List<Order> orders = null;

在这种情况下有什么问题?

感谢任何提示...

【问题讨论】:

  • 我认为这些答案与我的问题无关。我有一个现有的分离实体(customer1),它在新创建的实体(order1)上设置为多对一关系(客户)。我认为这是一个很常见的用例。当我 em.persist(order1) 因为我没有在 order1 中设置 id 时,Hibernate 会在它想要保留 customer1 时抱怨。
  • 您是否也将您的 customer1 设置为 order1?
  • 我在最初的回答中已经说过了,今天我更准确地澄清了这一点......而且,因为我之前使用 Glassfish 和它的 EclipseLink,这没有问题......

标签: hibernate jpa persistence


【解决方案1】:

以下答案也回答了我的问题。我从使用em.persist() 更改为em.merge(),即使对于新实体也是如此。现在我的整个对象图都成功地持久化了,无论是否混合了新实体。

JPA cascade persist and references to detached entities throws PersistentObjectException. Why?

而且我还删除了CascadeType.PERSIST

【讨论】:

    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多