我有一个涉及 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/