Объект, возвращаемый методом сохранения CrudRepository, не имеет прокси для дочерних объектов - PullRequest
0 голосов
/ 04 августа 2020

Когда пользователь добавляет новую запись во внешний интерфейс, вызывается этот внутренний метод:

@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;

Таким образом, сущность Запись имеет 2 дочерних сущности, связанных с ней: Агент и Проект. Проблема в том, что после вызова сохранения savedEntity не имеет проксированных методов getAgent () и getProject (). Поля агента и проекта пустые. Даже retrievedSavedRecording не имеет этих двух полей.

Что мне нужно сделать, чтобы получить агент и дочерние объекты проекта?

1 Ответ

0 голосов
/ 04 августа 2020
  • Сначала попробуйте это, это может сработать так же, как и для столбцов, сгенерированных базой данных, но здесь предполагается, что связь создается базой данных.
    @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);
        }
        

     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...