java - 如何手动打开 hibernate session ?

标签 java hibernate spring lazy-loading

我有一个涉及 spring 和 hibernate 的相当大的项目。现在,我正在将某些对象从 hibernate 状态中恢复到内存中,但我遇到了一些障碍。我有以下设置。

A 类包含许多原语和一个 B 类。B 包含原语和一个 C 类,它以前是延迟加载

现在我有这个

服务调用 1:
1.) 创建 A 类的对象
2.) 获取 B 类的对象
3.) 在A中设置B
4.) 将 A 添加到内存中

服务电话 2:
1.) 从内存中获取 A
2.) 从 A 得到 B
3.) 从 B 得到 C
4.) 在 C 上操作

因为 C 是延迟加载的,它依赖于现有的 hibernate session 来使用 hibernate 从 B 延迟加载自身,至少我相信是这样。但是,现在我需要延迟加载而不修改 DAO 以返回一个 ID,并且不存在当前 hibernate session 可以通过 OpenSessionInView 劫持。鉴于限制,解决此问题的最佳方法是什么?我发现的唯一解决方案依赖于不合适的代码更改或现有 session ,因此我认为我或许可以手动打开一个 hibernate session 。我该怎么做呢?或者,是否有更好的解决方案来解决这个问题?

最佳答案

作为最佳实践,您需要使用 session 工厂。这是 Netbeans 生成的。

public class HibernateUtil {

    private static final SessionFactory sessionFactory;
    private static final Configuration configuration = new Configuration().configure();

    static {
        try {
            // Create the SessionFactory from standard (hibernate.cfg.xml) 
            // config file.
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

一旦你有了这个,你就可以使用这个代码进行交易

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
//Do something
session.getTransaction().commit();

请注意,打开一个事务将打开一个 session 。我相信在纯 Hibernate 下(与 JPA 不同)你需要一个事务来做任何事情,甚至是读取。

在类(class)结束时,你要确保这样做

HibernateUtil.getSessionFactory().close();

对于更复杂的解决方案,您可能需要研究使用 Spring 或 EJB 的自动 session /事务管理。一旦配置正确,它将在幕后处理 session 。

编辑:
只需重新阅读您的问题和您关于 ID 的观点。我相信 sessionfactory 方法将适用于您的目的,除非您正在执行多线程应用程序。这是因为,默认情况下,Hibernate session 和链接到该 session 的 ORM 对象仅与一个线程关联。如果我对此有误,请告诉我。

关于java - 如何手动打开 hibernate session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/884423/

相关文章:

java - 在Java中下载同名附件而不覆盖

java - JComboBox动态更新值

java - 服务器空闲后 Hibernate Session 创建异常

facebook - Spring Social Facebook 中的 UsersConnectionRepository 是什么?

java - @RequestBody 注释在 Spring 中不起作用并给出 NoSuchMethodError 错误

java - Spring 启动: InvalidTypeIdException When Trying to Parse Json

java - 如何从正在使用的文件中读取

java - Hibernate 类 - 从一个 View (表)读取,并写入另一个

oracle order by 运行速度非常慢

java - 多个映射到 Spring 中 Controller 的相同方法