代码之家  ›  专栏  ›  技术社区  ›  Rahul Gupta

Session.save引发TransientObject异常

  •  1
  • Rahul Gupta  · 技术社区  · 8 年前

    学生 课程 许多 关系 . 当我读到 this typical cascading problem 这导致了这个异常,但在这里我也处理过,但仍然 我在调用save方法时得到TransientObjectException,而persist方法工作正常 . 有人能解释一下这里发生了什么吗?

    这是我的代码:

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

    学生.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 + "]";
        }
    
    }
    

    Course.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
    
    4 回复  |  直到 8 年前
        1
  •  1
  •   MOnkey    7 年前

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

    @Cascade(CascadeType.SAVE_UPDATE)
    

    使用中的注意事项 cascade={CascadeType.ALL}

        2
  •  1
  •   Fran Montero    7 年前

    您已经为persist和merge定义了级联模式,但是对于save,您必须声明Cascade=ALL或手动保存相关实体:

    cascade=CascadeType.ALL

        3
  •  0
  •   balamurugan    8 年前

    你应该试试而不是

    会话。保存()

    使用

        4
  •  0
  •   Angad Bansode    7 年前

    试试这个,对我有用

    Student s = new Student();
           s.setName("Gopal");
    Course c1 = new Course();
           c1.setCourseTitle("courseTitle1");   
    Course c2 = new Course();
           c2.setCourseTitle("courseTitle2");
    
    // adding courses to student entity
     s. getCourseList().add(c1);
     s. getCourseList().add(c2);
    
    
    // adding a student to courses.
     c1.getStudentList().add(s);
     c2.getStudentList().add(s);
    
    
     // saving all entities to DB.
         session.save(s);
         session.save(c1);
         session.save(c2);    
    
        transaction.commit();
        session.flush();