Временное принудительное исключение LazyInitializationException
Традиционно мы стараемся избегать LazyInitializationException
s. Однако мне нужно временно разрешить их бросать. Это псевдокод того, что я пытаюсь сделать:
Session session = ...;
Customer customer = (Customer) session.get(Customer.class, 56);
// All eagerly fetched data is now in memory.
disconnectSession(session);
// Attempts to access lazy data throw LazyInitializationExceptions.
// I want to take advantage of this fact to *only* access data that
// is currently in memory.
magicallySerializeDataCurrentlyInMemory(customer);
// Now that the in-memory data has been serialized, I want to re-connect
// the session.
reconnectSession(session);
magicallySerializeDataCurrentlyInMemory
Метод рекурсивно пытается сериализовать данные в памяти customer
и связанные с ним объекты, поглощая LazyInitializationException
по пути.
Попытка № 1: session.disconnect
/ session.reconnect
В этой попытке я использовал этот шаблон:
Connection connection = session.disconnect();
magicallySerializeDataCurrentlyInMemory(customer);
session.reconnect(connection);
К сожалению, это не бросило LazyInitializationException
s.
Попытка № 2: session.close
/ session.reconnect
В этой попытке я использовал этот шаблон:
Connection connection = session.close();
magicallySerializeDataCurrentlyInMemory(customer);
session.reconnect(connection);
К сожалению, это оказало session
бесполезный после session.reconnect(connection)
,
Как я могу временно заставить LazyInitializationException
s?
1 ответ
Нет способа временно закрыть сеанс. Что вы можете сделать, это удалить сущность из сеанса и затем вернуть ее обратно.
session.evict(customer);
//do something will throw lazy load
session.refresh(customer);
подключите и переподключите, просто вручную определите, какое конкретное соединение JDBC используется. Сеанс гибернации - это более крупная концепция, чем одиночное соединение JDBC. Связь это просто ресурс к нему. Он может использовать множество различных физических соединений с базами данных на протяжении всего своего жизненного цикла и не беспокоиться об этом. Если вы отключитесь, попросите сессию что-то сделать, она просто получит другое соединение.