1

JBoss AS 7.1でHibernateを使用していますが、新しいエンティティを作成して既存のエンティティをManyToOneリレーションに設定すると問題が発生します。次のコードを使用する前に、既存のエンティティ(顧客)が照会されます。

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

次の例外を除いて、 orderに設定した後em.persist(order)、新しいエンティティでを実行すると、次の例外がスローされます。ordercustomerorder.setCustomer(customer)

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;

このシナリオの何が問題になっていますか?

ヒントをありがとう...

4

1 に答える 1

1

次の回答も私の質問に答えます。新しいエンティティの使用em.persist()から変更しました。em.merge()これで、新しいエンティティが混在しているかどうかに関係なく、オブジェクト グラフ全体が正常に永続化されました。

JPA カスケードの永続化と切り離されたエンティティへの参照は、PersistentObjectException をスローします。なんで?

そしてさらに私は削除しましたCascadeType.PERSIST

于 2012-09-03T21:56:29.027 に答える