我在Hibernate 4中生成会话工厂时遇到了麻烦。在Hibernate 3中我简单地做了:
org.hibernate.cfg.Configuration conf= HibernateUtil
.getLimsInitializedConfiguration(systemConfiguration
.getHibernateconfFile());
SessionFactory sf = conf.configure().buildSessionFactory();
现在我需要将ServiceRegistry类传递给buildSessionFactory,但是Javadocs对于如何解决这个问题非常模糊。有什么提示吗?
答案 0 :(得分:70)
是的,他们已经弃用了以前的buildSessionFactory API,并且很容易做得很好..你可以这样做......
编辑:不推荐使用ServiceRegistryBuilder。你必须使用StandardServiceRegistryBuilder
public void testConnection() throws Exception {
logger.info("Trying to create a test connection with the database.");
Configuration configuration = new Configuration();
configuration.configure("hibernate_sp.cfg.xml");
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory sessionFactory = configuration.buildSessionFactory(ssrb.build());
Session session = sessionFactory.openSession();
logger.info("Test connection with the database created successfuly.");
}
有关更多参考和深入细节,您可以在https://github.com/hibernate/hibernate-orm/blob/master/hibernate-testing/src/main/java/org/hibernate/testing/junit4/BaseCoreFunctionalTestCase.java函数(buildSessionFactory())查看hibernate的官方测试用例。
答案 1 :(得分:18)
试试这个!
package your.package;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class HibernateUtil
{
private static SessionFactory sessionFactory;
private static ServiceRegistry serviceRegistry;
static
{
try
{
// Configuration configuration = new Configuration();
Configuration configuration = new Configuration().configure();
serviceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}
catch (HibernateException he)
{
System.err.println("Error creating Session: " + he);
throw new ExceptionInInitializerError(he);
}
}
public static SessionFactory getSessionFactory()
{
return sessionFactory;
}
}
答案 2 :(得分:11)
Configuration hibConfiguration = new Configuration()
.addResource("wp4core/hibernate/config/table.hbm.xml")
.configure();
serviceRegistry = new ServiceRegistryBuilder()
.applySettings(hibConfiguration.getProperties())
.buildServiceRegistry();
sessionFactory = hibConfiguration.buildSessionFactory(serviceRegistry);
session = sessionFactory.withOptions().openSession();
答案 3 :(得分:7)
以下表达了我对hibernate 4.0.0.Final的体验。
org.hibernate.cfg.Configuration
类的javadoc(在LGPL许可下分发)声明:
注意:这将取代
ServiceRegistryBuilder
和。{org.hibernate.metamodel.MetadataSources
在4.0版本之后,此类将被弃用并计划在5.0中删除。请参阅HHH-6183,HHH-2578和 HHH-6586了解详情
在查看问题2578之后,我使用了类似的东西:
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().configure().buildServiceRegistry();
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
metadataSources.addResource("some_mapping.hbm.xml")
SessionFactory sessionFactory = metadataSources.buildMetadata().buildSessionFactory();
为了开始阅读配置,我必须修改我的hibernate 3.2.6配置和映射文件以使用xmlns="http://www.hibernate.org/xsd/hibernate-configuration"
和xmlns="http://www.hibernate.org/xsd/hibernate-mapping"
,并删除dtd规范。
我无法找到一种方法来检查hibernate.cfg.xml中定义的映射和 hibernate.cfg.xml hibernate。前缀>不再是可选的。
这可能适用于某些人。
我,其中之一遇到了一些错误,因为映射文件包含<cache usage="read-write" />
并最终使用了弃用的配置方式:
Configuration configuration = new Configuration().configure();
SessionFactoryImpl sessionFactory = (SessionFactoryImpl) configuration.buildSessionFactory();
EventListenerRegistry listenerRegistry = sessionFactory.getServiceRegistry().getService(EventListenerRegistry.class);
SolrIndexEventListener indexListener = new SolrIndexEventListener(); // a SaveOrUpdateEventListener i wanted to attach
listenerRegistry.appendListeners(EventType.SAVE_UPDATE, indexListener);
我必须以编程方式附加事件侦听器,因为Configuration不再在hibernate.cfg.xml中查找它们
答案 4 :(得分:5)
即使4.3.0 API中有更新。 ServiceRegistryBuilder在4.3.0中也已弃用,并替换为StandardServiceRegistryBuilder。现在,创建会话工厂的实际代码将显示为example on creating session factory。
答案 5 :(得分:2)
[引自http://www.javabeat.net/session-factory-hibernate-4/]
hibernate核心框架中不推荐使用许多API。目前令人沮丧的一点是,hibernate官方文档没有提供关于如何使用新API的明确说明以及文档完整的统计信息。此外,每个增量版本都会对某些重要的API进行更改。其中一个问题是用于在病房中的Hibernate 4.3.0中创建会话工厂的新API。在我们早期的版本中,我们创建了会话工厂,如下所示:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
方法buildSessionFactory已从hibernate 4发行版中弃用,并被新API替换。如果您使用的是hibernate 4.3.0及更高版本,则代码必须是:
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());
类ServiceRegistryBuilder由4.3.0中的StandardServiceRegistryBuilder取代。看起来5.0版本中会有很多变化。对于已弃用的API以及使用的合适替代方案,仍然没有太多的清晰度。每个增量版本都会提供更多已弃用的API,它们可以对5.0版本的核心框架进行微调。
答案 6 :(得分:1)
在早期版本中,会话工厂创建如下:
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
方法buildSessionFactory已从hibernate 4发行版中弃用,并被新API替换。如果您使用的是hibernate 4.3.0及更高版本,则代码必须如下:
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().
applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());
答案 7 :(得分:1)
Hibernate 4版本不推荐使用方法buildSessionFactory
,它将替换为新的API。如果您使用的是Hibernate 4.3.0及更高版本,则代码必须是:
Configuration configuration = new Configuration().configure();
StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties());
SessionFactory factory = configuration.buildSessionFactory(builder.build());