传统上,我们尝试避免 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
。
session.disconnect
/ session.reconnect
在这次尝试中,我使用了这种模式:
Connection connection = session.disconnect();
magicallySerializeDataCurrentlyInMemory(customer);
session.reconnect(connection);
不幸的是,它没有抛出LazyInitializationException
s。
session.close
/ session.reconnect
在这次尝试中,我使用了这种模式:
Connection connection = session.close();
magicallySerializeDataCurrentlyInMemory(customer);
session.reconnect(connection);
不幸的是,这导致session
之后的session.reconnect(connection)
无效。
我如何暂时强制LazyInitializationException
?
答案 0 :(得分:1)
无法暂时关闭会话。您可以做的是从会话中删除实体,然后将其放回。
session.evict(customer);
//do something will throw lazy load
session.refresh(customer);
连接并重新连接只需手动管理正在使用的特定JDBC连接。休眠会话是一个比单个JDBC连接更大的概念。连接只是它的一个资源。它可以在整个生命周期中使用许多不同的物理数据库连接,而不是在意。如果你断开连接然后要求Session做某事,它就会得到另一个连接。