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/

posted @ 2016-06-03 11:55  山妖  阅读(385)  评论(0)    收藏  举报