专栏首页TheOneGIS空间站Hibernate入门遇到的一些问题

Hibernate入门遇到的一些问题

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的时候请注意!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • leetcode 14 | 最长公共前缀

    分析:找到数组中长度最小的元素min(从后面更快的例子来看,这个好像不需要~),然后从min的第一字符开始,去查找剩余元素是否在相同位置是同一个字符。

    ACM算法日常
  • 一些常用的算法技巧总结

    今天和大家讲讲,在做算法题时常用的一些技巧。对于平时没用过这些技巧的人,或许你可以考虑试着去看看在实践中能否用的上这些技巧来优化问题的解。

    Java3y
  • 学编程能做什么工作?这5种高大上的工作你喜欢么!

    学泥瓦工可以码砖头、学裁缝能做衣服,这个都有明确的方向。那我们学编程能从事那些工作呢?码农?岂止是码农!而且大家太小看码农了,码农也分了很多种,一起来看看吧!

    老九君
  • 【剑指offer】33.二叉树镜像

    可以看到首先对根节点的左右进行翻转。 再递归的对左子树,以及右子树进行翻转。 之前讲过,链表的题目分为四个步骤:连过来、指针走、断后路、调状态。 二涉及到树的...

    Leetcode名企之路
  • 聊聊flink的MemCheckpointStreamFactory

    flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/CheckpointS...

    codecraft
  • Pandas-层次化索引

    层次化索引是pandas的一项重要功能,它能使你在一个轴上有多个索引级别,也就是说,它能使你以低维度形式处理高维度数据,比如下面的代码:

    用户1332428
  • Golang学习笔记之方法(method)

    一个方法只是一个函数,它有一个特殊的接收者(receiver)类型,该接收者放在 func 关键字和函数名之间。接收者可以是结构体类型或非结构体类型。可以在方法...

    李海彬
  • 聊聊flink的FsStateBackend

    flink-runtime_2.11-1.7.0-sources.jar!/org/apache/flink/runtime/state/StateBacken...

    codecraft
  • 聊聊flink的MemoryBackendCheckpointStorage

    本文主要研究一下flink的MemoryBackendCheckpointStorage

    codecraft
  • 如何成为一名顶级的C/C++程序员?

    从事c/c++开发已经差不多十几年了,C语言相对使用起来简单一些,做的项目多了经验积累多了,整体觉得更加可控一点,但是c++越做越觉得细节越多,也面试过几百人,...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券