Я использую случай, когда он вызывает следующее:
@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) Какой метод рекомендуется использовать?
Спасибо заранее.