Я использую случай, когда он вызывает следующее:
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public UserControl getUserControlById(Integer id){
return this.userControlRepository.getOne(id);
}
Обратите внимание, что @Transactional имеет Propagation.REQUIRES_NEW, и в репозитории используется getOne. Когда я запускаю приложение, я получаю следующее сообщение об ошибке:
Exception in thread "main" org.hibernate.LazyInitializationException:
could not initialize proxy - no Session
...
Но если я изменяю getOne(id) на findOne(id), все работает нормально.
BTW, перед тем, как вариант использования вызывает метод getUserControlById, он уже вызвал метод insertUserControl
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public UserControl insertUserControl(UserControl userControl) {
return this.userControlRepository.save(userControl);
}
Оба метода: Propagation.REQUIRES_NEW, потому что я выполняю простой аудит.
Я использую метод getOne, потому что он определен в интерфейсе JpaRepository, и мой интерфейс репозитория простирается оттуда, я, конечно, работаю с JPA.
Интерфейс JpaRepository распространяется от CrudRepository.
Метод findOne(id) определяется в CrudRepository.
Мои вопросы:
- Почему не удается выполнить метод
getOne(id)? - Когда я должен использовать метод
getOne(id)?
Я работаю с другими репозиториями, и все используют метод getOne(id), и все работает нормально, только когда я использую Propagation.REQUIRES_NEW, он терпит неудачу.
В соответствии с API getOne:
Возвращает ссылку на объект с указанным идентификатором.
В соответствии с API findOne:
Получает объект по его идентификатору.
3) Когда я должен использовать метод findOne(id)?
4) Какой метод рекомендуется использовать?
Спасибо заранее.