首页 > 解决方案 > 如何通过保存子对象来保存父对象

问题描述

我有 3 个实体:Instructor实体、Course实体和InstructorDetail实体。

3个实体之间有两种关系:

Instructor[one] - course[many]
Instructor[one] - InstructorDetail[one]

现在,当我在会话中保存新课程时出现此错误:

Exception in thread "main" java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: hibernate.one_to_many_bi.entity.Instructor

在 main() 中:

Session session = sessionFactory.openSession();
try {
    Instructor instructor = new Instructor("Susan", "Snow", "Susan@gmail.com");
    instructor.setInstructorDetail(new InstructorDetail("youtube", "video game"));
    Course course1 = new Course("Air Guitar - The Ultimate Guide");
    instructor.addCourse(course1);
    session.beginTransaction();
    session.save(course1);
    session.getTransaction().commit();
}
finally {
    session.close();
    sessionFactory.close();
}

为什么我的代码不起作用?我的Course课堂上已经有了所有类型的级联注释,除了CascadeType.REMOVE. 为什么 Instructor 和 InstructorDetail 没有通过级联自动保存到数据库中?

导师班:

@Entity
@Table(name = "instructor")
@Slf4j
@Data
public class Instructor {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column()
    private int id;

    @Column(name = "first_name")
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

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

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "instructor_detail_id")
    @ToString.Exclude
    @Setter(AccessLevel.NONE)
    private InstructorDetail instructorDetail;

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

    public Instructor() {}

    public Instructor(String firstName, String lastName, String email) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    public void setInstructorDetail(InstructorDetail instructorDetail) {
        instructorDetail.setInstructor(this);
        this.instructorDetail = instructorDetail;
    }

    public void addCourse(Course course) {
        if (courses == null) {
            courses = new ArrayList<>();
        }
        course.setInstructor(this);
        courses.add(course);
    }
}

课程类别:

@Entity
@Table(name = "course")
@Slf4j
@Data
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

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

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

    public Course() {
    }

    public Course(String title) {
        this.title = title;
    }
}

InstructorDetail类:

@Entity
@Table(name = "instructor_detail")
@Slf4j
@Data
public class InstructorDetail {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private int id;

    @Column(name = "youtube_channel")
    private String youtubeChannel;

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

    @OneToOne(mappedBy = "instructorDetail",
            cascade = {CascadeType.DETACH,
                    CascadeType.MERGE,
                    CascadeType.DETACH,
                    CascadeType.PERSIST,
                    CascadeType.REFRESH})

    @ToString.Exclude
    Instructor instructor;

    public InstructorDetail() {
    }

    public InstructorDetail(String youtubeChannel, String hobby) {
        this.youtubeChannel = youtubeChannel;
        this.hobby = hobby;
    }
}

我刚开始冬眠。我在网上做了一些研究,并没有发现太多关于父对象和子对象之间的依赖关系。如果有人能告诉我为什么我的代码不起作用,我真的很感激。

标签: javaspringhibernatejpaorm

解决方案


推荐阅读