Временное принудительное исключение 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. Связь это просто ресурс к нему. Он может использовать множество различных физических соединений с базами данных на протяжении всего своего жизненного цикла и не беспокоиться об этом. Если вы отключитесь, попросите сессию что-то сделать, она просто получит другое соединение.

Другие вопросы по тегам