Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA/Hibernate-不使用persist()保存子级_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java JPA/Hibernate-不使用persist()保存子级

Java JPA/Hibernate-不使用persist()保存子级,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,据我所知,persist(object)方法-每当我们将新对象保存到数据库中时,都应该使用它(使其成为持久对象) 在我的例子中,我有一本@OneToMany关系中的书类(家长)和一个评论类(孩子)-一本书有很多评论 以下是课程: @Entity @Table(name = "book") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name =

据我所知,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
}


有人能解释一下吗?

您认为级联是什么意思。所有的在定义关系时都没有,顺便说一句,如果您使用的是Spring,我真的不希望您使用这段代码。谢谢,Cascade.ALL包括Cascade.PERSIST,它对相关实体执行PERSIST()操作。我还没有使用Spring,但正在准备学习它。我认为您混淆了概念,当调用addReview方法时,您正在将一个对象添加到另一个Java对象的属性中,但是您必须使用persist或merge方法通过实体管理器将该对象“发送”到数据库
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();
        }
    }