Временное принудительное исключение LazyInitializationException - PullRequest
0 голосов
/ 03 апреля 2012

Традиционно мы стараемся избегать LazyInitializationException с. Однако мне нужно временно позволить им быть брошенными. Вот псевдокод того, что я пытаюсь сделать:

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 s.

Попытка # 1: session.disconnect / session.reconnect

В этой попытке я использовал этот шаблон:

Connection connection = session.disconnect();

magicallySerializeDataCurrentlyInMemory(customer);

session.reconnect(connection);

К сожалению, это не бросило LazyInitializationException с.

Попытка № 2: session.close / session.reconnect

В этой попытке я использовал этот шаблон:

Connection connection = session.close();

magicallySerializeDataCurrentlyInMemory(customer);

session.reconnect(connection);

К сожалению, это session стало бесполезным после session.reconnect(connection).

Как я могу временно сила LazyInitializationException с?

1 Ответ

1 голос
/ 03 апреля 2012

Нет способа временно закрыть сеанс. Что вы можете сделать, это удалить сущность из сеанса и затем вернуть ее обратно.

session.evict(customer);
//do something will throw lazy load
session.refresh(customer);

подключите и переподключите, просто вручную определите, какое конкретное соединение JDBC используется. Сеанс гибернации - это более крупная концепция, чем одиночное соединение JDBC. Связь - это просто ресурс к нему. Он может использовать множество различных физических соединений с базами данных на протяжении всего своего жизненного цикла и не беспокоиться об этом. Если вы отключитесь, попросите сессию что-то сделать, она просто получит другое соединение.

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