所以,假设我有两个实体:
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
//@ToString(exclude = "courseMaterial")
public class Course {
@Id
@SequenceGenerator(name = "course_sequence", sequenceName = "course_sequence", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "course_sequence")
private Long courseId;
private String title;
private Integer credit;
//bidirectional mapping
@OneToOne(mappedBy = "course", cascade = CascadeType.ALL)
private CourseMaterial courseMaterial;
}
和
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
//@ToString(exclude = "course")
public class CourseMaterial {
@Id
@SequenceGenerator(name = "course_material_sequence", sequenceName = "course_material_sequence", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "course_material_sequence")
private Long courseMaterialId;
private String url;
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "course_id", referencedColumnName = "courseId")
private Course course;
}
测试
@SpringBootTest
class CourseMaterialRepositoryTest {
@Autowired
private CourseMaterialRepository courseMaterialRepository;
@Test
public void saveCourseMaterial() {
Course course = Course.builder()
.title(".net-2")
.credit(7)
.build();
CourseMaterial courseMaterial = CourseMaterial.builder()
.url("www.dotnet.com")
.course(course)
.build();
courseMaterialRepository.save(courseMaterial);
}
@Test
public void printAllCourseMaterials() {
List<CourseMaterial> courseMaterials =
courseMaterialRepository.findAll();
System.out.println("courseMaterials = " + courseMaterials);
}
}
和
@SpringBootTest
class CourseRepositoryTest {
@Autowired
CourseRepository courseRepository;
@Test
public void saveCourse() {
CourseMaterial courseMaterial = CourseMaterial.builder()
.url("www.codejava.com")
.build();
Course course = Course.builder()
.title("JAVA")
.credit(6)
.courseMaterial(courseMaterial)
.build();
courseRepository.save(course);
}
@Test
public void printCourses() {
List<Course> courses = courseRepository.findAll();
System.out.println("courses = " + courses);
}
}
所以在这里,当我从
CourseMaterialRepositoryTest.saveCourseMaterial()
方法保存数据时,courseId
保存在 course_material
表中。
但是当我从 CourseRepositoryTest.saveCourse()
方法保存时,courseId
不会保存在 course_material
表中。
请帮我解决这个问题。
这就是 JPA 关系的运作方式。
中的
mappedBy
属性
@OneToOne(mappedBy = "course", cascade = CascadeType.ALL)
private CourseMaterial courseMaterial;
声明该关系由
Coursematerial.course
控制,并且它是关系持久化时唯一重要的值。
另一端仅在从数据库加载时读取匹配的数据。
当不从数据库加载数据时,您必须确保双方一致。