10

Hibernate EntityManager persist メソッドを使用して mysql db に person pojo を挿入しようとしていますが、

entityManagerTransactionService.getEntityManager().persist(TemplateObject);

この例外を取得すると、

 javax.persistence.PersistenceException:
 org.hibernate.PersistentObjectException: detached entity passed to
 persist: com.esupu.base.model.pojo.common.TitleType    at
 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)....

もっとあります..

 Caused by: org.hibernate.PersistentObjectException: detached entity
 passed to persist: com.esupu.base.model.pojo.common.TitleType  at
 org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:141)
    at
 org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:843)

私の Person.java クラスは、

@Entity
public class Person extends TemplateObject {

    @OneToOne(cascade = { CascadeType.MERGE, CascadeType.PERSIST,CascadeType.REFRESH })
        private TitleType titleType;
        private String middle;
        private String last;
        @OneToOne(cascade = { CascadeType.ALL })
        private Address address;
        private Date birthdate;
        private String email;
        private String telephone;
        private String fax;
        @OneToOne(cascade = { CascadeType.ALL })
        private Location location;
        @OneToOne(cascade = { CascadeType.ALL })
        private Country country;

そして、pojo のゲッター セッター メソッド ..

TitleType クラスをスローするエラーは、「public static final」タイトル タイプ定義プロバイダーです。

@Entity
public class TitleType extends TemplateObject {

    /**
     * 
     */
    private static final long serialVersionUID = 3104954552111621034L;

    private TitleType(int id, String name) {
        setId(id);
        setName(name);
    }

    public static final TitleType MR = new TitleType(1, "Mr");
    public static final TitleType MISS = new TitleType(2, "Miss");
    public static final TitleType MRS = new TitleType(3, "Mrs");
    public static final TitleType MS = new TitleType(4, "Ms");
    public static final TitleType DOCTOR = new TitleType(5, "Doctor");
    public static final TitleType PROFESSOR = new TitleType(6, "Professor");
    public static final TitleType SIR = new TitleType(7, "Sir");
    public static final TitleType MADAM = new TitleType(8, "Madam");

}

タイトルタイプのクラスを人に設定しています。

person.setTitleType(TitleType.MR);

public static final 型で定義されたクラスを Hibernate に渡すことは不可能ですか? または私が間違っていることはありますか?

前もって感謝します

4

2 に答える 2

21

永続化しようとしているオブジェクトには、値TitleTypeを持つべきではないものが含まれていIDます。それ以外の場合、Hibernate は、そのオブジェクトが永続的であるか、セッション コンテキストで切り離されているかを確認します。そのようなオブジェクトの一部のフィールドを永続化したくない場合は@Transient、エンティティを永続化するときに注釈を使用してフィールド マップからそれらのフィールドを除外できます。これらの値は何らかのジェネレーターによって生成される可能性があるため、これは DAO またはエンティティで ID をハードコーディングするのには適していませんが、この定数を使用してデータベースを手動で更新する場合は、少なくともこれらの ID をコードで定数として定義し、ID ごとにセッションからオブジェクトを読み込むことができます。一時インスタンスまたは永続インスタンスを初期化する前。

于 2013-10-26T19:22:03.567 に答える
13

これを行う代わりに:public static final TitleType MR = new TitleType(1, "Mr");

そのオブジェクトを取得するには、EntityManager を使用する必要があります。それ以外の場合、Hibernate は、このオブジェクト (ID 1 を持つ) が既に格納されていることに気付きますが、ロードしていないため、エンティティ マネージャは独自のコレクション内にそれを持っていません -> それは切り離されたエンティティです。

したがって、次のことを行う必要があります。

TitleType MR = em.find(TitleType.class, 1);
Person p = new Person(...);
p.setTitleType(MR);

em.merge(p);
于 2013-10-26T19:30:06.500 に答える