首页 > 解决方案 > JPA/Hibernate - 在没有 persist() 的情况下保存孩子

问题描述

据我了解persist(object)方法- 每当我们将新对象保存到数据库时都应该使用它(以使其成为持久对象)。

在我的示例中,我在@OneToMany关系中有一个Book类(父)和一个Review类(子)——一本书有很多评论。

MySQL 表

以下是课程:

@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();
        }
    }

在此处输入图像描述

谁能解释一下?

标签: javaspringhibernatejpa

解决方案


推荐阅读