为什么双向映射不能从关系双方获取价值?

问题描述 投票:0回答:1

所以,假设我有两个实体:

@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
表中。

请帮我解决这个问题。

java spring-boot hibernate jpa spring-data-jpa
1个回答
0
投票

这就是 JPA 关系的运作方式。

 中的 
mappedBy

属性
@OneToOne(mappedBy = "course", cascade = CascadeType.ALL)
private CourseMaterial courseMaterial;

声明该关系由

Coursematerial.course
控制,并且它是关系持久化时唯一重要的值。 另一端仅在从数据库加载时读取匹配的数据。 当不从数据库加载数据时,您必须确保双方一致。

© www.soinside.com 2019 - 2024. All rights reserved.