我有一个相当大的项目,涉及 spring 和 hibernate。现在,我正在将某些对象从休眠状态恢复到内存中,但我遇到了一些障碍。我有以下设置。
A 类包含多个基元和一个 B 类。B 包含基元和一个 C 类(以前是惰性加载.
现在我有这个
服务电话1:
1.) 创建A类对象
2.) 获取B类对象
3.) 将 B 设置为 A
4.) 将 A 添加到内存中
服务电话2:
1.) 从记忆中得到A
2.) 从A得到B
3.) 从B得到C
4.) 对C进行操作
因为 C 是延迟加载的,所以它依赖于现有的 hibernate 会话通过 hibernate 从 B 延迟加载自身,至少我相信是这样。然而现在我需要延迟加载without修改DAO以返回ID,并且存在无电流使用 OpenSessionInView 劫持休眠会话。考虑到局限性,解决这个问题的最佳方法是什么?我发现的唯一解决方案依赖于不合适的代码更改或现有会话,因此我认为我也许可以手动打开休眠会话。我该怎么做呢?或者,是否有更好的解决方案来解决这个问题?
作为最佳实践,您需要使用会话工厂。这是 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();
请注意,打开事务将打开会话。我相信在纯 Hibernate 下(与 JPA 不同),您需要事务来执行任何操作,甚至读取。
在计划结束时,您要确保这样做
HibernateUtil.getSessionFactory().close();
对于更复杂的解决方案,您可能需要研究使用 Spring 或 EJB 的自动会话/事务管理。一旦正确配置,它将在幕后处理会话。
EDIT:
只需重新阅读您的问题和有关 ID 的观点即可。我相信 sessionfactory 方法将适合您的目的,除非您正在执行多线程应用程序。这是因为,默认情况下,Hibernate 会话和链接到该会话的 ORM 对象仅与一个线程关联。如果我对此有误,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)