【发布时间】:2019-08-12 18:59:13
【问题描述】:
我下面的示例是出于学习目的。目标是使用Composite identifiers 创建一些示例。不幸的是,我得到了一些奇怪的结果。
实体:Course、Teacher、CoursePk。
每门课程只能由一位Teacher 授课。
我在 Teacher 类和 Course 类之间使用双向关系 @OneToOne()。
每个Course 都包含一个复合主键。在我的示例中,我进行了简化,并且使用了仅使用一个属性的复合主键。
我的示例的目标是在持久化课程对象时持久化关联的教师。
Teacher 类:
@Entity(name = "Teacher")
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "firstName")
private String firstName;
@Column(name = "lastName")
private String lastName;
@OneToOne(mappedBy = "officialTeacher")
private Course course;
//setter getter constructors are omitted for brevity
}
Course 类:
@Entity(name = "Course")
public class Course {
@EmbeddedId
private CoursePk pkCourse;
@OneToOne(cascade = CascadeType.PERSIST)
private Teacher officialTeacher;
//setter getter constructors are omitted for brevity
}
应该表示复合主键的CoursePk。
@Embeddable
public class CoursePk implements Serializable {
@Column(name = "courseName")
private Integer courseId;
}
我的运行示例:
private void composedPrimaryKey() {
Teacher teacher = new Teacher("Jeff", "Boss");
CoursePk composedPK = new CoursePk(1);
Course course = new Course(composedPK, teacher);
Course savedCourse = courseRepository.save(course);
}
这样我的表格看起来像:
课程表
course_name | official_teacher_id
1 | 1
教师桌
id | first_name |last_name
1 | null | null
如您所见,老师的信息并没有被持久化,而只有id字段。
神奇的是,当我将级联类型更改为CascadeType.ALL 时,所有内容都被持久化了。
id | first_name |last_name
1 | Jeff | Boss
有人可以解释为什么它不能仅与 CascadeType.PERSIST 一起使用。
【问题讨论】:
标签: java hibernate spring-data-jpa hibernate-cascade