2016-11-16 5 views
0
Library lib; //has a OneToMany rs to Book 
lib = new Library(); 

Book book; //has a OneToMany rs to Letters 
book = new Book(lib); 
book.save() 

book = new Book(lib); 
book.merge() //.save() will throw an exception (detached entity passed to persist jpa) because of lib, so I merge it 

Letters letters; 
letters = new Letters(book); 
letters.save(); //throws TransientPropertyValueException: object references an unsaved transient instance. 

同じライブラリを使用して複数のブックを作成して保存したいと思います。また、同じ本を使って複数の手紙を作って保管したいと思っています。 (書籍)をマージした後、本はもはや一過性ではないので、しかし、私は...、これを実現する方法をmerge()の後も、オブジェクトは未保存の一時的インスタンスとしてマークされています

おかげ

編集を知らない:物事をより明確にするために追加のクラスを追加しました。

public abstract class Model implements Serializable { 
/** 
* Save the current object in the database. 
* 
*/ 
public void save() { 
    EntityManager entityManager = HibernateUtil.getEntityManagerFactory().createEntityManager(); 
    entityManager.getTransaction().begin(); 
    entityManager.persist(this); 
    entityManager.getTransaction().commit(); 
    entityManager.close(); 
} 
/** 
* Delete the current object from the database. 
* 
*/ 
public void delete() { 
    EntityManager entityManager = HibernateUtil.getEntityManagerFactory().createEntityManager(); 
    entityManager.getTransaction().begin(); 
    entityManager.remove(entityManager.contains(this) ? this : entityManager.merge(this)); 
    entityManager.getTransaction().commit(); 
    entityManager.close(); 
} 

public void merge(){ 
    EntityManager entityManager = HibernateUtil.getEntityManagerFactory().createEntityManager(); 
    entityManager.getTransaction().begin(); 
    entityManager.merge(this); 
    entityManager.getTransaction().commit(); 
    entityManager.close(); 
} 
} 

ブックエンティティ(文字とライブラリのエンティティが同じように見える)

@Entity 
@Table(name = "book") 
public class Book{ 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Column(name = "BOOK_ID") 
private Integer id; 

@OneToMany(fetch = FetchType.LAZY, mappedBy = "book", cascade = {CascadeType.ALL}) 
private List<Letters> letters; 

@ManyToOne(fetch = FetchType.LAZY,cascade = {CascadeType.ALL}) 
@JoinColumn(name = "lib_id") 
Library library; 

}

+1

私は本当にあなたの説明に従うことはできませんが、マージ()は引数を添付しません。別のアタッチされたインスタンスを返します。 –

+0

@JB Nizet hm。私の説明にはどこに問題がありますか?私は今、保存とマージの違いを理解していますが、私はまだコード内でこれを修正する方法を知りません。 – Lamevire

+1

いいえ、私が言っているのは、マージ(foo)はfooに何も変更しないということです。 fooを管理オブジェクトにすることはありません。 ** **管理されている別のオブジェクトを返します。 managedFoo =マージ(foo)。 –

答えて

0

言うことを意図している何@JBNizetあなたがdevelop better your question, make it clearerする必要があるということです!

あなたの質問については、私はあなたがそれに類似したエンティティの構造を持っているとします

エンティティ図書館:

@Entity 
@Table(name = "library") 
public class Library { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "LIB_ID") 
    private Integer id; 

    @OneToMany(mappedBy = "library") 
    private List<Book> books; 

    // getters & setters 
} 

エンティティ帳:

@Entity 
@Table(name = "book") 
public class Book { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "BOOK_ID") 
    private Integer id; 

    @ManyToOne 
    @JoinColumn(name = "LIB_ID") 
    private Library library; 

    @OneToMany(mappedBy = "book") 
    private List<Letters> letters; 

    // ... 
} 

エンティティ書簡:

@Entity 
@Table(name = "letters") 
public class Letters { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "LETTERS_ID") 
    private Integer id; 

    @ManyToOne 
    @JoinColumn(name = "BOOK_ID") 
    private Book book; 

    // ... 

} 

すでにhere述べたように、この問題は通常、あなたの@ManyToOneへのマッピングcascade=CascadeType.ALLの欠如に関連しています。

ただし、セッションを開いてすべてのオブジェクトを保存/マージしてコミット/クローズすると、関係のカスケードタイプを変更する必要があります。これを行う:

  • CascadeType.MERGE@ManyToOne(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
  • 変化としてBookクラス内の他のすべてのカスケードをlibraryオブジェクトのカスケード型にしてください。この方法では、JPAはオブジェクトのツリー全体を保存する必要があるたびに、それらを常にマージしようとします。
+0

申し訳ありませんが、私はそれが私の記述でどのように見えるかは明らかです。しかし、あなたは正しい.1つの違いでクラスがどのように見えるのか:私は既にカスケード= CascadeType.ALLを含んでいた。else em.save(book); 私はdetached entitiy例外をalredyに与えます。あなたが間違っている、私は同じ顧客客体を保持する本にsave()を2回使用することはできません。 – Lamevire

+0

*私は "libはもはや一時的ではない"という意味です – Lamevire

+0

今私はあなたが望むものを理解しました。私は自分の答えを更新した – bosco

関連する問題