java - 暂时强制 LazyInitializationExceptions

标签 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

尝试#2:session.close/session.reconnect

在这次尝试中,我使用了这种模式:

Connection connection = session.close();

magicallySerializeDataCurrentlyInMemory(customer);

session.reconnect(connection);

不幸的是,这使得 sessionsession.reconnect(connection) 之后变得无用。

我如何暂时强制LazyInitializationException

最佳答案

没有办法暂时关闭 session 。您可以做的就是从 session 中删除实体,然后将其放回去。

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

连接和重新连接只需手动管理正在使用的特定 JDBC 连接。 hibernate Session 是一个比单个 JDBC 连接更大的概念。连接只是它的一个资源。它可以在整个生命周期中使用许多不同的物理数据库连接,而不关心一点。如果您断开连接然后要求 session 执行某些操作,它只会获取另一个连接。

关于java - 暂时强制 LazyInitializationExceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999098/

相关文章:

java - 为什么 Eclipse 中的“问题” View 没有显示我的所有错误?

java - 获取两个字符的 charAt

hibernate 。增强的标识符生成器

java - hibernate.hbm2ddl.auto create-drop 与生产数据库

ios - Swift 惰性和可选属性

java - 组织.apache.jasper.JasperException : Unable to compile class for JSP:

java - Android 代码在后端出现错误。但我不知道代码哪里出了问题

java - SEQUENCE_NEXT_HI_VALUE的含义

java - 如何修复非线程安全的延迟初始化 CXF 客户端工厂?

c# - 无法反序列化惰性对象