У меня есть сценарий, в котором мне нужно сохранить объект с несколькими ассоциациями, но я не хочу получать эти ассоциации, если в этом нет необходимости.
Я постараюсь привести простой пример:
Entites:
public class Foo {
private Long idFoo;
private String defaultMessage;
/* Getters and Setters Ommited */
}
public class Bar {
private Long idBar;
private String message;
/*one-to-one lasy assoc*/
private Foo foo;
/* Getters and Setters Ommited */
}
Бар входной DTO
Public class BarInputDTO {
private String message;
@NotNull
private idFoo;
/* Getters and Setters Ommited */
}
Служба сохранения Бар
public void saveAsEntity(BarInputDTO dto) {
Bar bar = new Bar();
//Getting a reference do foo
bar.setFoo(fooRepository.getOne(dto.getIdFoo()));
if (dto.getMessage().equals("")) {
/*
* I just want to load the association if there is no message.
* but get - LazyInitializationException: could not initialize proxy - no session
*/
bar.setMessage(bar.getFoo().getDefaultMessage());
} else {
bar.setMessage(dto.getMessage);
}
barRepository.save(bar);
}
Как говорится в комментарии, я просто хочу загрузить ассоциацию, если нет сообщения. Но в этой ситуации я получаю LazyInitializationException. Если сообщение информировано, Бар сохраняется.
Я понимаю, что fooRepository.getOne открывает и закрывает транзакцию, когда она вызывается, тогда, когда я вызываю getDefaultMessage, сеанса нет. Я предполагал, что добавление аннотации @Transaction к методу решит проблему, но я ошибся.
Конечно, я мог бы получить объект Foo непосредственно из fooRepo внутри предложения if, но мой реальный сценарий немного сложнее, и это было бы очень повторяющейся задачей.
Что-то мне не хватает, чтобы это работало?
Tks!