1. 配置文件位置
使用Configuration config = new Configuration().configure();读取Hibernate的配置文件,文件的默认名称为hibernate.cfg.xml,而且文件必须位于src根目录下。
那如果想自定义文件位置呢?
比如我放置的配置文件位置为src/configs/hibernate.cfg.xml。那么代码中这样写就行了,Configuration config = new Configuration().configure("configs/hibernate.cfg.xml");
还有就是在/hibernate.cfg.xml中,mapping结点有一个resource属性,这个属性包含的是Hibernate映射文件的路径,这个路径按照放置在src下面的路径写就好了。
比如说,我的一个映射文件Event.hbm.xml的路径为src/configs/domain/Event.hbm.xml,那么resource重应该为configs/domain/Event.hbm.xml。
2.错误:No appropriate connection provider encountered, assuming application will be supplying connections
Hibernate官方文档中建立SessionFactory有这样一个类:
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
// Create the SessionFactory from hibernate.cfg.xml
new Configuration().configure().buildSessionFactory(
new StandardServiceRegistryBuilder().build() );
}
catch (Throwable ex) {
// Make sure you log the exception, as it might be swallowed
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
注:这段代码本身有问题:buildSessionFactory方法没有写返回值,这是次要的。
但是,我安装这个类进行操作,结果就报错了:No appropriate connection provider encountered, assuming application will be supplying connections。
经过资料查询,发现有两种解决办法:
①不适用带参数的buildSessionFactory方法,直接使用不带参数的buildSessionFactory方法。可以运行程序确实不会报错了,但是不带参数的buildSessionFactory方法在API中已经被标注为过时。
②最终解决方法:
public class SessionFactoryUtil {
private static SessionFactory sessionFactory;
private static SessionFactory buildSessionFactory() {
try {
Configuration configuration = new Configuration().configure("configs/hibernate.cfg.xml");
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
SessionFactory sessionFactory = configuration
.buildSessionFactory(serviceRegistry);
return sessionFactory;
}
catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
if(sessionFactory == null) sessionFactory = buildSessionFactory();
return sessionFactory;
}
}
最后说明一下,在4.1等有些版本中,没有StandardServiceRegistryBuilder类,而是使用如下语句进行ServiceRegistry类的创建的:
ServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
所以不同版本的Hibernate创建SessionFactory的时候请注意!