gpt4 book ai didi

java - Session.save 抛出 TransientObjectException

转载 作者:行者123 更新时间:2023-11-30 02:04:17 24 4
gpt4 key购买 nike

我有两个名为学生类(class)的实体,它们具有多对多关系。正如我在this中读到的那样文章中我们可以调用 save 方法来保存事务中的相关实体,或者一旦 session 被刷新它就会被保存。我也明白typical cascading problem这会导致此异常,但在这里我也处理了它,但仍然在调用 save 方法时遇到 TransientObjectException,而 persist 方法工作得很好。有人可以解释一下这里发生了什么吗?

这是我的代码:

SaveVsPersistTest.java

public class SaveVsPersistTest {


public static void main(String[] args) {
// Create session factory object
SessionFactory sessionFactory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(Student.class)
.addAnnotatedClass(Course.class)
.buildSessionFactory();

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();

Student student = new Student("Gopal");

Course course1 = new Course("Java");
Course course2 = new Course("C++");

student.addCourse(course1);
student.addCourse(course2);

session.save(student);

transaction.commit();
session.flush();
}

}

Student.java

@Entity
@Table(name="student")
public class Student {

public Student() {
}

public Student(String name) {
super();
this.name = name;
}

@Id
@Column(name="student_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

@Column(name="student_name")
private String name;

@ManyToMany(cascade={CascadeType.DETACH,CascadeType.REFRESH,CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name="student_course",
joinColumns={@JoinColumn(name="student_id")},
inverseJoinColumns={@JoinColumn(name="course_id")})
private List<Course> courseList;

public void addCourse(Course tempcourse) {
if(courseList == null){
courseList= new ArrayList<>();
}
courseList.add(tempcourse);
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public List<Course> getCourseList() {
return courseList;
}

public void setCourseList(List<Course> courseList) {
this.courseList = courseList;
}

@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", courseList=" + courseList + "]";
}

}

类(class).java

@Entity
@Table(name="course")
public class Course {

public Course() {
}

public Course(String courseTitle) {
super();
this.courseTitle = courseTitle;
}



@Id
@Column(name="course_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

@Column(name="course_title")
private String courseTitle;

@ManyToMany(cascade={CascadeType.DETACH,CascadeType.REFRESH,CascadeType.PERSIST,CascadeType.MERGE})
@JoinTable(name="student_course",
joinColumns={@JoinColumn(name="course_id")},
inverseJoinColumns={@JoinColumn(name="student_id")})
private List<Student> StudentList;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getCourseTitle() {
return courseTitle;
}

public void setCourseTitle(String courseTitle) {
this.courseTitle = courseTitle;
}

public List<Student> getStudentList() {
return StudentList;
}

public void setStudentList(List<Student> studentList) {
StudentList = studentList;
}

@Override
public String toString() {
return "Course [id=" + id + ", courseTitle=" + courseTitle + ", StudentList=" + StudentList + "]";
}

}

异常

Exception in thread "main" org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: manytomany.demo.Course

最佳答案

正如其他人建议的,您可以显式地在所有相关实体上调用 session.save,或者您可以使用 Hibernate Specific @Cascade注释如下所示。

@Cascade(CascadeType.SAVE_UPDATE)

在任何关联上使用 cascade={CascadeType.ALL} 时需要注意的是,一旦对父对象调用 delete,所有子对象(或表中的行)都会被删除。所以要谨慎一点。

关于java - Session.save 抛出 TransientObjectException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51819758/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com