SpringJPA - 以一对多关系保存子对象后,在父对象中找不到它的findOne()

时间:2017-08-20 10:33:16

标签: java jpa spring-boot spring-data-jpa

当我保存子对象并尝试再次获取父对象时,我没有得到关联的子对象。我正在使用SpringJPA,并且我遵循一对多的关系。

class ClassRoom {
     @Id
     private Integer classId;
     OneToMany(mappedBy="classRoom", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
     private Set<Student> students;

}
class Student {
     @Id
     private Integer studentId;
     @Column(name="class_room_id", insertable = false, updateable = false)
     private Integer classRoomId;
     ManyToOne
     JoinColumn(name = "class_room_id", referencedColumnName="class_room_id")
     private ClassRoom classRoom;
}

即使我使用ClassRoomRepository.findOne(classRoomId),它仍然只返回一个类。我相信它的预期行为,因为它返回缓存的实例。有没有办法强制JPA获取所有关联。我甚至试图在两个单独的事务中进行保存和获取,但我仍然得到相同的错误。

有人可以指导我如何执行此操作,因为我认为这是一种常见的用例场景吗?

更新: 以下是调用这些事务的代码

class StudentProxy {
   public void saveAndLoadStudent() {
      studentService.saveStudent();
      studentService.loadClassRoom();
  }
}

class StudentService {
    @Transactional
    public void saveStudent() {
         studentRespository.save(student);
    }

    @Transactional
    public void loadClassRoom() {
          ClassRoom classRoom = classRoomRepository.findOne(classRoomId);
          // classRoom has no students in it.   
    }

1 个答案:

答案 0 :(得分:0)

您没有发布ClassRoom实际获得Student的方式。但是可能会发生一个常见的错误:

如果您更改StudentClassRoom的设置,则不会保存,因为该关系由Student方控制。

除了JPA不应该使用缓存实例,如果你启动一个新的事务,假设你没有配置二级缓存,甚至应该失效。