java - JPA/Hibernate - 在没有 persist() 的情况下保存孩子
问题描述
据我了解persist(object)方法- 每当我们将新对象保存到数据库时都应该使用它(以使其成为持久对象)。
在我的示例中,我在@OneToMany关系中有一个Book类(父)和一个Review类(子)——一本书有很多评论。
以下是课程:
@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
}
我的问题是 - 我怎么能在不调用persist(review)而是简单地使用 book 的方法addReview(review)的情况下向数据库添加评论?
这是将评论添加到相关书籍和数据库的方法。此实体上的所有操作都正常工作 - 我可以获得评论、更新或删除它。
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();
}
}
谁能解释一下?
解决方案
推荐阅读
- javascript - 仅当源字段格式设置为具有名称时才将 Amazon SES 电子邮件标记为垃圾邮件
- c# - 通过 JsonProperty 属性值将对象列表投影到另一种类型
- python - 查询 SQLAlchemy 时间到 Pandas 时间(Python)
- javascript - 提交后如何清除FormData()
- postgresql - 如何正确删除 postresql 中的索引唯一性?
- r - 如何从 R 中的列表创建多个矩阵或数据框?
- python - Django 如何在不刷新或重新加载页面的情况下插入数据
- java - 在单选按钮可绘制的左侧添加填充
- python - 如何使用列表理解创建三角形列表?
- multithreading - 仅扫描新文件并下载而不是将其上传到其他地方的程序上的多线程