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.
出於測試目的,我想創建使用相同的庫多本圖書,並將它們保存。另外我想創建多個字母,使用同一本書並存儲它們。但我不知道如何實現這一點,因爲合併後的(書),這本書不再瞬態..(),對象仍標記爲未保存的瞬態的實例
感謝
編輯:增加了額外的類使事情變得更加清晰。
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();
}
}
Book實體(Letter和圖書館實體看起來是一樣的)
@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;
}
我不能真正按照你的解釋,但merge()不附加參數。它返回另一個連接的實例。 –
@JB Nizet hm。我的解釋在哪裏有問題?現在理解保存和合並之間的區別,但我仍然不知道如何在我的代碼中修復此問題。 – Lamevire
不,我要說的是merge(foo)不會改變任何foo。它不會讓foo成爲一個託管對象。它**返回**另一個被管理的對象。 managedFoo = merge(foo)。 –