У меня следующая ошибка:
Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: my.shop.common.fliPusto.origins.User.spectatingBooks, could not initialize proxy - no Session
Я пытаюсь инициализировать карту с Hibernate.initialize()
и myObject.getMyMap().size()
, но оба они выдают исключение.
Мой класс с HashMap:
@Entity
@Table(name = "users")
public class User implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
...
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "spectatingBooks", joinColumns = @JoinColumn(name =
"user_id"))
@MapKeyJoinColumn(name = "book_id")
@Column(name = "lastChapter")
private Map<Book, Long> spectatingBooks = new HashMap<Book, Long>();
}
Когда я меняю тип выборки с Lazy на Eager, все работает нормально, но я думаю, что это неправильно.
Мой класс, который пытается добавить несколько книг:
@Transactional
@Service
public class UserDetailsServiceImpl implements UserDetailsService,
UserDetailsServiceImplInterface {
...
@Transactional
public Boolean addBookmark(User user, Long bookId) {
Optional<Book> book = bookRepository.findById(bookId);
if (book.isPresent()) {
Hibernate.initialize(user);
int size = user.getSpectatingBooks().size(); <--Exception
user.getSpectatingBooks().put(book.get(),
Integer.toUnsignedLong(0));
userRepository.save(user);
return true;
}
return false;
}
}
Существует ли способ создания экземпляров HashMap Lazily или он будет работать только с Fetch.Eager?