Как работать с ленивой инициализацией Spring + Hibernate?

127
25 августа 2019, 10:30

Класс User:

@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
private int id;
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "notes")
@MapKeyColumn(name = "NOTE_TIME")
@Column(name = "NOTE_TEXT")
private Map<Timestamp, String> notes = new HashMap<>();
/........../
}

Метод контроллера:

@GetMapping(value = "/notes")
public String notes(HttpSession session){
    User user = (User) session.getAttribute("user");
    user.getNotes(); // - org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: esn.entities.User.notes, could not initialize proxy - no Session
    return "notes";
}

Как мне инициализировать notes? Видел, что существует метод Hibernate.initialize(), но по-видимому в моём случае он не поможет. C бд работаю через EntityManager и признаюсь, плохо понимаю, как работают сессии hibernate.

UPDATE:

    @GetMapping(value = "/notes")
    @Transactional
    public String notes(HttpSession session){
        User user = (User) session.getAttribute("user");
        User user2 = userDAO.getUserById(user.getId());
        Hibernate.initialize(user2.getNotes()); // - LazyInitializationException
        return "notes";
    }

UserDAO:

@Repository("user_dao")
@Transactional
public class UserDAO {
    @PersistenceContext
    private EntityManager em;
    @Transactional
    public void persistUser(User user) {
        em.persist(user);
    }
    @Transactional
    public void updateUser(User user) {
        em.merge(user);
    }
    @Transactional
    public User getUserById(Integer id) {
        return em.find(User.class, id);
    }
}
Answer 1

Не знаю насколько этот подход правильный, но решил таким образом:

метод контроллера:

@GetMapping(value = "/notes")
    public String notes(HttpSession session){
        User user = (User) session.getAttribute("user");
        User user2 = userDAO.getUserWithNotes(user.getId());
        session.setAttribute("user", user2);
        return "notes";
    }

Добавил специальный метод получения юзера с инициализированным списком notes:

Repository("user_dao")
@Transactional
public class UserDAO {
    @PersistenceContext
    private EntityManager em;
    @Transactional
    public User getUserWithNotes(Integer id){
        User user = em.find(User.class, id);
        Hibernate.initialize(user.getNotes());
        return user;
    }
}
READ ALSO
Как использовать CefCookieManager вместе с java.net.URL

Как использовать CefCookieManager вместе с java.net.URL

Куки заранее получил через авторизацию браузера CefBrowserДелаю так:

124
VK oauth2 client_secret is undefined

VK oauth2 client_secret is undefined

Я получаю такую ошибку

107
База данных в графическом интерфейсе

База данных в графическом интерфейсе

Я создал программу на java с интерфейсом школьный журналИ там в меню есть кнопка которая выводит всех студентов которые хранятся у меня в базе...

114
Back with User Interface. Как происходит связь UI c Back

Back with User Interface. Как происходит связь UI c Back

Объясните пожалуйста, как происходит связь ui с back (в java)Например есть MVC, есть controller, model, view (в качестве view, у меня jsp)

116