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;
}
私は本当にあなたの説明に従うことはできませんが、マージ()は引数を添付しません。別のアタッチされたインスタンスを返します。 –
@JB Nizet hm。私の説明にはどこに問題がありますか?私は今、保存とマージの違いを理解していますが、私はまだコード内でこれを修正する方法を知りません。 – Lamevire
いいえ、私が言っているのは、マージ(foo)はfooに何も変更しないということです。 fooを管理オブジェクトにすることはありません。 ** **管理されている別のオブジェクトを返します。 managedFoo =マージ(foo)。 –