当我使用 session.save 而不是 session.persist 时到底发生了什么?

What exactly happens when I use session.save instead of session.persist?

我知道这是一个很常见的话题。我也阅读了很多博客和与之相关的 post,但大多数只是说出 save() return 是标识符和 persist() 具有 [=79] 的区别=] 类型的无效。两者都属于包 org.hibernate.

我也阅读了以下 posts:

我有一个数据库如下。

对于那些不使用 IntelliJ IDEA 的人,instructor_id 在 table course 中充当外键,它引用 instructor(id) 并且类似地用于另一个 table 也是。

我试图通过以下方式将课程保存给讲师:

session.beginTransaction();

// get the instructor from the database
int theId = 1;
Instructor tempInstructor =
    session.get(Instructor.class, theId);

// create some courses
Course tempCourse1 = new Course("Java");
Course tempCourse2 = new Course("Maven");
tempInstructor.add(tempCourse1, tempCourse2);

session.save(tempInstructor);

// Commit transaction
session.getTransaction().commit();

Instructorclass中的相关条目:

@OneToMany(mappedBy = "instructor",
            cascade = {CascadeType.DETACH, CascadeType.PERSIST,
                    CascadeType.MERGE, CascadeType.REFRESH})
private List<Course> courses;

Instructor-

中的add方法
public void add(Course... tempCourse) {

    if (courses == null) {
        courses = new ArrayList<>();
    }

    for (Course course : tempCourse) {
        courses.add(course);
        course.setInstructor(this);
    }


}

Courseclass中的相关条目:

@ManyToOne(cascade = {CascadeType.DETACH, CascadeType.PERSIST,
            CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name = "instructor_id")
private Instructor instructor; // Associated Entity

当我尝试使用 session.save(tempInstructor); 保存讲师时,none 的课程在我使用 session.save() 时与讲师一起保存,但当我使用 session.persist() 时这两个课程也被保存。我知道 save() return 是一个标识符和 INSERTS 对象,那为什么不保存课程呢?

我也在某处读过

save() is not good in a long-running conversation with an extended Session/persistence context.

当我调用保存时发生了什么,为什么没有保存对象?

在您的示例中,tempCourse1tempCourse2 处于分离状态,因此要建立关系,您需要保留它们。

savepersist 做同样的事情,但是 save 是 Hibernate 的 API 而 persist 是 JPA 规范的一部分。

在您的实体上,您有 CascadeType.PERSIST,它仅与 persist 方法相关。要使 save 表现相同,您应该将 org.hibernate.annotations.CascadeType#SAVE_UPDATE 添加到 ManyToOne 注释中。