暂时强制LazyInitializationExceptions

时间:2012-04-03 18:22:27

标签: java hibernate lazy-initialization

传统上,我们尝试避免 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

尝试#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

1 个答案:

答案 0 :(得分:1)

无法暂时关闭会话。您可以做的是从会话中删除实体,然后将其放回。

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

连接并重新连接只需手动管理正在使用的特定JDBC连接。休眠会话是一个比单个JDBC连接更大的概念。连接只是它的一个资源。它可以在整个生命周期中使用许多不同的物理数据库连接,而不是在意。如果你断开连接然后要求Session做某事,它就会得到另一个连接。