CrudRepository保存方法返回的实体没有子实体的代理



当用户在前端添加新记录时,此后端方法被调用:

@PostMapping(path = "recordings/add")
@Transactional
public RecordingDTO add(@RequestBody RecordingDTO recordingDTO) {
Recording recording = new Recording();
recording.setAgentId(recordingDTO.getAgent().getId());
recording.setProjectId(recordingDTO.getProject().getId());
... other irrelevant fields are set here...
Recording savedRecording = recordingsRepository.save(recording);
Recording retrievedSavedRecording = recordingsRepository.findById(savedRecording.getId()).get();
return new RecordingDTO(retrievedSavedRecording);
}

录制是一个看起来像这样的实体:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "agent_id")
private Long agentId;
@Column(name = "project_id")
private Long projectId;
... more columns here; omitted for not being relevant
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "agent_id", referencedColumnName = "id", insertable = false, updatable = false)
public Agent agent;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "project_id", referencedColumnName = "id", insertable = false, updatable = false)
public Project project;

因此Recording实体有两个子实体与其关联:Agent和Project。问题是调用save后,savedEntity没有代理getAgent((和getProject((方法。代理和项目字段为null。即使是检索的SavedRecording也没有这两个字段。

为了能够检索代理和项目子实体,我必须做什么?

  • 先试试这个,它可能像处理数据库生成的列一样工作,但这里假设关系是数据库生成的
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "agent_id", ....)
@Generated(GenerationTime.ALWAYS)
public Agent agent;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "project_id"...)
@Generated(GenerationTime.ALWAYS)
public Project project;
  • 如果不起作用,您可以尝试创建一个服务,它可能会起作用,并从控制器中删除@Transactional
@PostMapping(path = "recordings/add")
public RecordingDTO add(@RequestBody RecordingDTO recordingDTO) {
Recording recording = new Recording();
recording.setAgentId(recordingDTO.getAgent().getId());
recording.setProjectId(recordingDTO.getProject().getId());
... other irrelevant fields are set here...

Recording savedRecording = recordingService.save(recording);

return new RecordingDTO(retrievedSavedRecording);
}
@Service
public class RecordingService {
@Autowired
RecordingsRepository recordingsRepository;
@Transactional
public Recording findById(Long id){
Recording retrievedSavedRecording 
=  recordingsRepository.findById(recording);
return new RecordingDTO(retrievedSavedRecording); 
}

@Transactional
public RecordingDTO saveRecording(Recording recording){
return recordingsRepository.save(recording);
}

}

最新更新