寻找一个不被弃用的会话工厂

我正在处理hibernate,当我打开当前项目时,我发现我的Session-Factory已被弃用:

AnnotationConfiguration af = new AnnotationConfiguration(); SessionFactory factory = af.configure().buildSessionFactory(); Session session = factory.openSession(); 

AnnotationConfiguration现在似乎已经被弃用了……所以我检查了JavaDoc并告诉它它被移动到:

org.hibernate.cfg.Configuration

我的代码到目前为止工作得很好,实际上我不想改变它……但是我用Google搜索并发现有人在问自己同样的问题为什么SessionFactory需要更改… http://rgordon.co.uk/博客/ 2012/02/24 /hibernate-请-不要-贬低自己动手/

该文章来自2012年(所以不是那么古老……)并以这种方式描述所有内容:

 ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder(); serviceRegistryBuilder.applySettings(properties); ServiceRegistry serviceRegistry = serviceRegistryBuilder.buildServiceRegistry(); Configuration configuration = new Configuration().addClass(FeedTradePersistable.class); SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); 

我实现了那个。 JavaDoc再次certificate了错误! 已过时。 它指的是:

org.hibernate.boot.registry.StandardServiceRegistryBuilder

我再次用Google搜索。 结果不那么令人满意……

我开始修改代码……

 ServiceRegistry serviceRegistry = serviceRegistryBuilder.build(); Configuration configuration = new Configuration(); SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); Session session = sessionFactory.openSession(); 

抛出exception……

org.hibernate.HibernateException:未设置’hibernate.dialect’时,Connection不能为null

在线:

 SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); 

我很确定这是因为我没有指定任何配置设置。 其实,我不想。 我对hibernate.cfg.xml感到满意。

我使用configuration.addFile玩了一下(… – 不是那么成功……

有没有人对此有所了解? 谢谢

更新:(hibernate.cfg.xml)

     com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc:sqlserver://localhost\SQLEXPRESS qohelet password thread false org.hibernate.dialect.SQLServerDialect 240 5 3 10 60 20 50 3      

更新(2014年2月16日):我认为有必要向您展示我的pom.xml。 我花了一段时间才弄清楚Hibernate-Framework的哪个组合适合我…

  org.hibernate.common hibernate-commons-annotations 4.0.2.Final   org.hibernate hibernate-core 3.6.10.Final   hibernate-commons-annotations org.hibernate.common   hibernate-jpa-2.1-api org.hibernate.javax.persistence   hibernate-commons-annotations org.hibernate     org.hibernate hibernate-entitymanager 4.1.8.Final   hibernate org.hibernate   hibernate-annotations org.hibernate   hibernate-commons-annotations org.hibernate   hibernate-jpa-2.1-api org.hibernate.javax.persistence     org.hibernate hibernate-commons-annotations 3.2.0.Final   org.hibernate.javax.persistence hibernate-jpa-2.0-api 1.0.1.Final   org.hibernate hibernate-jpamodelgen 1.1.1.Final provided  

我认为4.3现在是:

  Configuration configuration=new Configuration() .configure(); // configures settings from hibernate.cfg.xml StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder(); // If you miss the below line then it will complaing about a missing dialect setting serviceRegistryBuilder.applySettings(configuration.getProperties()); ServiceRegistry serviceRegistry = serviceRegistryBuilder.build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); 

是的,在hibernate版本4中.3不推荐使用buildSessionfactory()和ServiceRegistryBuilder()。

所以你已经改变了你的编码,如下所示,以获得hibernate版本4.3的会话工厂

 public class HibernateSessionFactory { private static final SessionFactory sessionFactory = buildSessionFactory1(); private static SessionFactory buildSessionFactory1() { Configuration configuration = new Configuration().configure(); // configuration // settings // from // hibernate.cfg.xml StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder(); serviceRegistryBuilder.applySettings(configuration.getProperties()); ServiceRegistry serviceRegistry = serviceRegistryBuilder.build(); return configuration.buildSessionFactory(serviceRegistry); } public static SessionFactory getSessionFactory() { return sessionFactory; } public static void shutdown() { // Close caches and connection pools getSessionFactory().close(); } 

}

由于我有时间对我的软件进行现代化改造,所以我决定付出一些努力并进行一些研究:

http://www.codejava.net/frameworks/hibernate/building-hibernate-sessionfactory-from-service-registry提供了一个现代的HibernateUtil

 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; public static SessionFactory getSessionFactory() { if (sessionFactory == null) { Configuration configuration = new Configuration().configure(); ServiceRegistryBuilder registry = new ServiceRegistryBuilder(); registry.applySettings(configuration.getProperties()); ServiceRegistry serviceRegistry = registry.buildServiceRegistry(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); } return sessionFactory; } } 

即使这个版本似乎也有效:

 import java.util.logging.Level; import java.util.logging.Logger; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { Configuration cfg = new Configuration(); sessionFactory = cfg.configure("hibernate.cfg.xml").buildSessionFactory(); } catch (Throwable ex) { Logger.getLogger(HibernateUtil.class.getName()).log(Level.SEVERE, null, ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } 

}

但我的问题是我不想将新版本与旧库集成。 更新后我遇到了一个

java.lang.NoSuchMethodError:org.hibernate.annotations.common.reflection.java.JavaReflectionManager.injectClassLoaderDelegate(Lorg / hibernate / annotations / common / reflection / ClassLoaderDelegate;)V

经常。 烦人。 通常Mkyong提供了很好的解决方案,但在我的情况下,他编写了Stackoverflow的相反解决方案……

所以我搜索了一些存储库,发现了一个非常简单的解决方案(比较: http : //hibernate.org/orm/downloads/ ):

   org.hibernate hibernate-core 5.0.0.Final  

其他一些小问题阻止了我:在hibernate.cfg.xml我不得不将行从update更改为auto

 auto 

将它与我的旧pom.xml进行比较…… – 然后我与Hibernate进行了第一次“相遇”,并添加了一切看似有用的内容,直到它工作为止。 在它这样做之后我停止了触摸它…差不多两年……永远不要改变一个“胜利”的团队,对吧?

  org.hibernate.common hibernate-commons-annotations 4.0.2.Final   org.hibernate hibernate-core 4.1.12.Final   hibernate-commons-annotations org.hibernate.common   hibernate-jpa-2.1-api org.hibernate.javax.persistence   hibernate-commons-annotations org.hibernate     org.hibernate hibernate-entitymanager 4.1.8.Final   hibernate org.hibernate   hibernate-annotations org.hibernate   hibernate-commons-annotations org.hibernate   hibernate-jpa-2.1-api org.hibernate.javax.persistence      org.hibernate hibernate-commons-annotations 3.2.0.Final   org.hibernate.javax.persistence hibernate-jpa-2.0-api 1.0.1.Final   org.hibernate hibernate-jpamodelgen 1.1.1.Final provided