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)。 –