java - 保存父对象后自动保存子对象
问题描述
我已经看过 - 使用 JPA Hibernate 自动保存子对象
我有以下表格 -
- Instructor_Detail(id, youtubechannel, hobby) - PRIMARY_KEY (id)
- 讲师(id,first_name,last_name,email,instructor_detail_id) - PRIMARY_KEY(id),FOREIGN_KEY(instructor_detail_id)
- 课程(id,title,instructor_id) - PRIMARY_KEY(id),FOREIGN_KEY(instructor_id)
我正在尝试在我的 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 的新手,所以我的期望或理解可能会偏离。这可能吗?
解决方案
CascadeType
您配置的 JPA ( DETACH
, MERGE
, PERSIST
, ) 仅在与, , ,REFRESH
一起使用时具有级联效果。(见此)Session
evict()
merge()
persist()
refresh()
但是您session.save()
用于保存对象。这就是为什么它没有任何级联效果的原因。更改为以下任一选项应该可以解决问题:
(1) 全部CascadeType
改为ALL
。
(2)session.persist()
用于插入记录:
session.persist(insDet1);
推荐阅读
- java - 当metod返回ResponseEntiry时如何返回ModelandView
抛出错误? - python - 为什么这个字典理解会为所有键生成相同的值?
- laravel - 如何在 laravel 中间件中删除此错误?
- python-3.x - 无法从“bs4”导入名称“BeautifulSoup”
- javascript - React 中渲染的 HTML 内的可点击按钮
- sql - 如何比较两个表之间的日期时间戳
- ios - 锚点偏移不适用于 Here Maps Map Overlay (iOS Swift)
- django - Django APPEND_SLASH 无法正常工作
- reactjs - 用于反应和反应本机的可插入跨平台软件设计
- f# - F# propper 删除 ElapsedEventHandler 处理程序