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.
For testing purposes, I would like to create multiple books using the same library and save them. Also I would like to create multiple letters, using the same book and storing them aswell. But I don't know how to achieve this, because after merging(book), the book is not transient anymore..
thanks
edit: Added additional classes to make things more clear.
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 Entity (Letter and Library Entity look the same)
@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;
}