我下面的示例是出于学习目的。目标是使用复合标识符创建一些示例。不幸的是,我得到了一些奇怪的结果。
实体:Course
,Teacher
CoursePk
。_
每门课程只能由一个人授课Teacher
。
我@OneToOne()
在类之间使用双向关系Teacher
和 class之间使用双向关系Course
。
每个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
有人可以解释为什么它不适用于 only CascadeType.PERSIST
.