首页 > 解决方案 > 保存父对象后自动保存子对象

问题描述

我已经看过 - 使用 JPA Hibernate 自动保存子对象

Hibernate:OneToMany 通过级联保存孩子

我有以下表格 -

我正在尝试在我的 MainApp 中保存(instructorDetail),并希望自动保存相关的讲师和课程

这是我的课-

@Entity @Table(name="instructor_detail") 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.PERSIST,CascadeType.REFRESH }) private Instructor instructor; //getters and setters } @Entity @Table(name="instructor") public class Instructor { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") 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") private InstructorDetail instructorDetail; @OneToMany(mappedBy="instructor", cascade = {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH}) private List<Course> courses; //...getters and setters //one more method to add courses public void addCourse(Course c) { if(courses == null) { courses = new ArrayList<>(); } courses.add(c); c.setInstructor(this); } } @Entity @Table(name="course") public class Course { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private int id; @Column(name="title") private String title; @ManyToOne(cascade= {CascadeType.DETACH,CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH}) @JoinColumn(name="instructor_id") private Instructor instructor; //getters and setters } //MainClass - public class OneToManyBiDirectionalDemo { public static void main(String[] args) { Course c1 = new Course("Multithreading"); Course c2 = new Course("WebDevelopment"); Instructor ins1 = new Instructor("John","Purcell","john.purcell@email.com"); InstructorDetail insDet1 = new InstructorDetail("com.john.purcell","teaching"); insDet1.setInstructor(ins1); ins1.setInstructorDetail(insDet1); ins1.addCourse(c1); ins1.addCourse(c2); SessionFactory factory = new Configuration(). configure("hibernate.cfg.xml"). addAnnotatedClass(Course.class). addAnnotatedClass(Instructor.class). addAnnotatedClass(InstructorDetail.class). buildSessionFactory(); Session session = factory.getCurrentSession(); session.beginTransaction(); session.save(insDet1); session.getTransaction().commit(); session.close(); factory.close(); } }

我的期望是 - 当在 MainClass 中调用 save(instructorDetail) 时,教师和课程也应该自动保存。但是,执行当前只保存讲师详细信息,而不是讲师和课程。日志中只触发了一次插入,并且没有生成异常。我是 Hibernate 的新手,所以我的期望或理解可能会偏离。这可能吗?

标签: javahibernatejpa

解决方案


CascadeType您配置的 JPA ( DETACH, MERGE, PERSIST, ) 仅在与, , ,REFRESH一起使用时具有级联效果。(见此Sessionevict()merge()persist()refresh()

但是您session.save()用于保存对象。这就是为什么它没有任何级联效果的原因。更改为以下任一选项应该可以解决问题:

(1) 全部CascadeType改为ALL

(2)session.persist()用于插入记录:

  session.persist(insDet1);

推荐阅读