如何从 Hibernate 4.3.4.Final 中检索 sessionFactory?
Posted
技术标签:
【中文标题】如何从 Hibernate 4.3.4.Final 中检索 sessionFactory?【英文标题】:How to retrieve sessionFactory from Hibernate 4.3.4.Final? 【发布时间】:2014-04-17 13:06:19 【问题描述】:以前我使用以下代码配置 sessionFactory,但是在将我的休眠版本从 4.2.1.Final 升级到 4.3.4.Final 后,我无法使用以下代码检索 sessionFactory,因为 ServiceRegistryBuilder() 是已弃用。
我使用this link 创建它,但提供的函数没有返回任何东西,因此它会遇到预编译错误。
private static SessionFactory configureSessionFactory()
try
Configuration configuration = new Configuration();
configuration.configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
return sessionFactory;
catch (HibernateException e)
System.out.append("** Exception in SessionFactory **");
e.printStackTrace();
return sessionFactory;
static
try
sessionFactory = configureSessionFactory();
catch (Exception e)
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
private HibernateUtil()
public static SessionFactory getSessionFactory()
return sessionFactory;
public static Session getSession() throws HibernateException
Session session = threadLocal.get();
if (session == null || !session.isOpen())
if (sessionFactory == null)
rebuildSessionFactory();
session = (sessionFactory != null) ? sessionFactory.openSession() : null;
threadLocal.set(session);
return session;
public static void rebuildSessionFactory()
try
sessionFactory = configureSessionFactory();
catch (Exception e)
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
public static void closeSession() throws HibernateException
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null)
if (session.isOpen())
session.close();
【问题讨论】:
你的方法setField
是做什么的?毕竟这听起来很关键......
【参考方案1】:
在 4.3 中,您应该改用 StandardServiceRegistryBuilder
。
import org.hibernate.boot.registry.StandardServiceRegistryBuilder
StandardServiceRegistryBuilder
被添加为ServiceRegistryBuilder
的新父。其余的代码应该是一样的。我发现这个“清楚地”记录在案的唯一地方是 ServiceRegistryBuilder
的 4.3 JavaDocs。
我没有注意到的一件事是他们将 ServiceRegistryBuilder.buildServiceRegistry()
方法更改为 StandardServiceRegistryBuilder.build()
。因此,这将需要您更改构建过程的这一部分:
new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.buildServiceRegistry();
变成:
new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build();
【讨论】:
它返回以下错误 java.lang.reflect.InvocationTargetException, java.lang.NoSuchMethodError: org.hibernate.integrator.internal.IntegratorServiceImpl.(Ljava/util/LinkedHashSet;Lorg/hibernate/boot/registry /classloading/spi/ClassLoaderService;)V 消息:org.hibernate.integrator.internal.IntegratorServiceImpl.(Ljava/util/LinkedHashSet;Lorg/hibernate/boot/registry/classloading/spi/ClassLoaderService;)V 文件:org/hibernate/boot /registry/BootstrapServiceRegistryBuilder.java 行号:215 确保您已从类路径中删除了所有以前版本的 Hibernate。在github 上查看它,我不明白为什么会导致除非您遇到由版本冲突引起的类加载器问题,因为IntegratorServiceImpl
存在于您/曾经的两个版本中using,这向我暗示了一个类加载器问题。
@pickypg 请也看看我的问题,***.com/questions/23646389/…【参考方案2】:
是的,他们已经弃用了之前的 ServiceRegistryBuilder(),这里是你如何使用 Hibernate 4.3.4 来做到这一点
public void testConnection() throws Exception
logger.info("Trying to Connect With a DataBase.");
Configuration configuration = new Configuration();
configuration.configure("Your.cfg.xml");
ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder().applySettings(configuration
.getProperties());
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistryBuilder.buildServiceRegistry());
Session session = sessionFactory.openSession();
logger.info("Database connection created successfuly.");
来源:Create session factory in Hibernate 4
【讨论】:
ServiceRegistryBuilder 在版本 4.3.4.Final 上已弃用 version 4.3.4.Final @AlexCartio1 您的问题标题中已经提到了哪个版本的详细信息。无论如何,为了更清楚,我添加了 .3.4。【参考方案3】:我测试了这个,它可以在 Hibernate 4.3.6 上运行
public class HUtil private static SessionFactory sessionFactory; private static ServiceRegistry serviceRegistry; public static SessionFactory createSessionFactory() Configuration configuration = new Configuration(); configuration.configure(); serviceRegistry = new StandardServiceRegistryBuilder(). applySettings(configuration.getProperties()).build(); sessionFactory = configuration.configure(). buildSessionFactory(serviceRegistry); return sessionFactory; public static SessionFactory getSessionFactory() return createSessionFactory();
【讨论】:
以上是关于如何从 Hibernate 4.3.4.Final 中检索 sessionFactory?的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate:如何从 ScrollableResults 中检索我的实体?
如何从 Spring/Hibernate 调用存储的例程/函数?