当我使用 session.save 而不是 session.persist 时到底发生了什么?
What exactly happens when I use session.save instead of session.persist?
我知道这是一个很常见的话题。我也阅读了很多博客和与之相关的 post,但大多数只是说出 save()
return 是标识符和 persist()
具有 [=79] 的区别=] 类型的无效。两者都属于包 org.hibernate
.
我也阅读了以下 posts:
- Difference between save() and persist() in Hibernate
- What's the difference between session.persist() and session.save() in Hibernate?
- What are the differences between the different saving methods in Hibernate?
我有一个数据库如下。
对于那些不使用 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();
Instructor
class中的相关条目:
@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);
}
}
Course
class中的相关条目:
@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.
当我调用保存时发生了什么,为什么没有保存对象?
在您的示例中,tempCourse1
和 tempCourse2
处于分离状态,因此要建立关系,您需要保留它们。
save
和 persist
做同样的事情,但是 save
是 Hibernate 的 API 而 persist
是 JPA 规范的一部分。
在您的实体上,您有 CascadeType.PERSIST
,它仅与 persist
方法相关。要使 save
表现相同,您应该将 org.hibernate.annotations.CascadeType#SAVE_UPDATE
添加到 ManyToOne
注释中。
我知道这是一个很常见的话题。我也阅读了很多博客和与之相关的 post,但大多数只是说出 save()
return 是标识符和 persist()
具有 [=79] 的区别=] 类型的无效。两者都属于包 org.hibernate
.
我也阅读了以下 posts:
- Difference between save() and persist() in Hibernate
- What's the difference between session.persist() and session.save() in Hibernate?
- What are the differences between the different saving methods in Hibernate?
我有一个数据库如下。
对于那些不使用 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();
Instructor
class中的相关条目:
@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);
}
}
Course
class中的相关条目:
@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.
当我调用保存时发生了什么,为什么没有保存对象?
在您的示例中,tempCourse1
和 tempCourse2
处于分离状态,因此要建立关系,您需要保留它们。
save
和 persist
做同样的事情,但是 save
是 Hibernate 的 API 而 persist
是 JPA 规范的一部分。
在您的实体上,您有 CascadeType.PERSIST
,它仅与 persist
方法相关。要使 save
表现相同,您应该将 org.hibernate.annotations.CascadeType#SAVE_UPDATE
添加到 ManyToOne
注释中。