1

I use Hibernate on JBoss AS 7.1 and have problems when i create new entities and set an existing entity to a ManyToOne relation. The exising entity (customer) is queried before using the following code:

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

When i execute an em.persist(order) on the new entity order after setting customer to order with order.setCustomer(customer) the following exception is thrown:

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)

The entities are defined as follows:

@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;

What is wrong in this scenario?

Thanks for any hint...

Joysn
  • 987
  • 1
  • 16
  • 30
  • http://stackoverflow.com/questions/2441598/detached-entity-passed-to-persist-error-with-jpa-ejb-code will help. – d1e Aug 27 '12 at 06:38
  • i think these answers are not related to my problem. i have an existing detatched entity (customer1), which is set to a ManyToOne relation (customer) on a new created entity (order1). I think this is a quite common usecase. When i em.persist(order1) because i have no id set in order1, then Hibernate complains when it wants to persist customer1. – Joysn Aug 27 '12 at 07:50
  • Do you set your customer1 to order1 as well? – d1e Aug 27 '12 at 08:53
  • i already said this in my initial answer and today i clarified this more precisely... and, as i used Glassfish with its EclipseLink before, there were no issues with this ... – Joysn Aug 27 '12 at 13:51

1 Answers1

1

the following answers answer my question as well. i changed from using em.persist() to em.merge() even for new entities. And now my whole object graph is persisted sucessfully, whether there are new entities mixed in or not.

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

And furthermore i removed CascadeType.PERSIST

Community
  • 1
  • 1
Joysn
  • 987
  • 1
  • 16
  • 30