Насколько я понимаю, persist (object) метод - его следует использовать всякий раз, когда мы сохраняем новый объект в базе данных (чтобы сделать его управляемым постоянным).
В моем примере у меня есть Книга класс (родительский) и Отзыв класс (дочерний) в @ OneToMany отношениях - Одна книга имеет много рецензий.
Вот классы:
@Entity
@Table(name = "book")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "title")
private String title;
@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE,
CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name = "author_id")
private Author author;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "book_id", referencedColumnName = "id")
private List<Review> reviews;
//skipping setters and getters
public void addReview(Review review) {
if(reviews == null) {
reviews = new ArrayList<Review>();
}
reviews.add(review);
}
}
@Entity
@Table(name = "review")
public class Review {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "comment")
private String comment;
//skipping setters and getters
}
У меня вопрос - как я могу добавить обзор в базу данных без вызова сохраняются (обзор) , но просто с использованием метода книги addReview (обзор) ?
Вот метод, который добавляет обзор в связанную книгу и в базу данных. Все операции с этим объектом работают нормально - я могу получить обзор, обновить его или удалить.
public void addReviewToBook(String bookTitle, String comment) {
EntityManager em = ENTITY_MANAGER_FACTORY.createEntityManager();
Session session = em.unwrap(Session.class);
Criteria cr = session.createCriteria(Book.class);
cr.add(Restrictions.ilike("title", bookTitle));
Book book = null;
try {
book = (Book) cr.uniqueResult();
em.getTransaction().begin();
//not calling em.persist(new Review(comment)) but only using addReview method
book.addReview(new Review((comment)));
em.getTransaction().commit();
System.out.println("Review added to the book");
}
catch (HibernateException e) {
em.getTransaction().rollback();
e.printStackTrace();
}
finally {
em.close();
}
}
Может кто-нибудь объяснить это?