Не удалось лениво создать HashMap - PullRequest
1 голос
/ 02 апреля 2019

У меня следующая ошибка:

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?

1 Ответ

0 голосов
/ 02 апреля 2019

Я решил это, получив пользователя через userRepository, а не @AuthenticationPrinciple, но, может быть, существует другой способ?

@Transactional
public Boolean addBookmark(Long userId, Long bookId) {
    Optional<Book> book = bookRepository.findById(bookId);
    Optional<User> userOp = userRepository.findById(userId);

    if (book.isPresent() && userOp.isPresent()) {
        User user = userOp.get();
        int size = user.getSpectatingBooks().size();
        user.getSpectatingBooks().put(book.get(), Integer.toUnsignedLong(0));
        userRepository.save(user);
        return true;
    }

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