Hibernate5.1.0.Final的配置上的一点小问题
原本是不想用这么新的Hibernate框架的,毕竟新的东西资料比较少。由于使用的maven私库似乎jar包不全,hibernate4的jar包不是本身缺少就是相关缺少依赖包,所以就干脆用这个了。
一开始参照网上Hibernate4的样子写了SessionFactory。
1 package com.ynwi.ssh.daoImpl; 2 3 import org.hibernate.HibernateException; 4 import org.hibernate.Session; 5 import org.hibernate.SessionFactory; 6 import org.hibernate.cfg.Configuration; 7 import org.hibernate.service.ServiceRegistry; 8 import org.hibernate.service.ServiceRegistryBuilder; 9 10 public class HibernateSessionFactory { 11 12 private static final String CFG_FILE_LOCATION = "/Hibernate.cfg.xml"; 13 14 private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 15 16 private static final Configuration cfg = new Configuration() 17 .configure(CFG_FILE_LOCATION); 18 19 private static ServiceRegistryBuilder builder = new ServiceRegistryBuilder() 20 .applySettings(cfg.getProperties()); 21 22 private static ServiceRegistry registry; 23 24 private static SessionFactory sessionFactory; 25 26 public static Session currentSession() throws HibernateException { 27 Session session = threadLocal.get(); 28 29 if (session == null || session.isOpen() == false) { 30 31 if (sessionFactory == null) { 32 try { 33 registry = builder.buildServiceRegistry(); 34 sessionFactory = cfg.buildSessionFactory(registry); 35 } catch (Exception e) { 36 e.printStackTrace(); 37 } 38 } 39 40 session = sessionFactory.openSession(); 41 threadLocal.set(session); 42 43 } 44 45 return session; 46 } 47 48 public static void closeSession() throws HibernateException { 49 Session session = threadLocal.get(); 50 threadLocal.set(null); 51 if (session != null) { 52 session.close(); 53 } 54 } 55 56 }
然后测试,返回错误信息not mapped。

根据网上找来的一些建议,仔细检查了hibernate.cfg.xml配置,确认在src下面,并且添加了User.hbm.xml的mapping。HQL里写的也是类名不是表名。然后觉得应该是新版本的不同的地方。所以去查了官方文档。

嗯,sessionFactory这里是new了一个MetaDataSources,并且ServiceRegistry变成了StandardServiceRegistry,于是我就结合官方的例子做了修改
1 private static final String CFG_FILE_ADDRESS = "/hibernate.cfg.xml"; 2 3 private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 4 5 private static final Configuration cfg = new Configuration().configure(CFG_FILE_ADDRESS); 6 7 private static StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()); 8 9 private static ServiceRegistry registry; 10 11 private static SessionFactory sessionFactory; 12 13 public static Session currentSession() throws HibernateException { 14 Session session = threadLocal.get(); 15 16 if (session == null || session.isOpen() == false) { 17 18 if (sessionFactory == null) { 19 try { 20 registry = builder.build(); 21 sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory(); 22 } catch (HibernateException e) { 23 StandardServiceRegistryBuilder.destroy(registry); 24 e.printStackTrace(); 25 } 26 27 } 28 session = sessionFactory.openSession(); 29 threadLocal.set(session); 30 } 31 return session; 32 }
然后试了下,结果还是报了上面的错误。开始还以为是5.1不支持xml的mapping配置了,去改用注解配置,结果还是找不到。经过一番尝试,终于发现了问题,似乎StandardServiceRegistryBuilder 的applySettings方法已经没用了,要使用configure方法。
1 // private static final String CFG_FILE_ADDRESS = "/hibernate.cfg.xml"; 2 3 private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); 4 5 // private static final Configuration cfg = new Configuration().configure(CFG_FILE_ADDRESS); 6 7 // private static StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().configure(); 8 9 private static StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().configure();
由于hibernate.cfg.xml在src下,所以configure不用传配置路径。当然也可以这么写:
1 private static final String CFG_FILE_ADDRESS = "/hibernate.cfg.xml"; 2 private static StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().configure(CFG_FILE_ADDRESS);
参考路径:
Eclipse搭建SSH(Struts2+Spring3+Hibernate3)框架项目教程:http://blog.csdn.net/yeohcooller/article/details/9316923
Hibernate5.1 Doc: http://docs.jboss.org/hibernate/orm/5.1/quickstart/html_single/

浙公网安备 33010602011771号