学习:配置hibernate-阿里云开发者社区

开发者社区> 数据库> 正文

学习:配置hibernate

简介: 最近实现的一系列功能(权限管理,索引持久化等)都涉及到了持久化问题 之前做了一个基于XML的管理插件,只需要在第一次读取的时候使用到XML,之后数据来自缓存,这样可以满足权限管理的功能,但是一旦权限发生动态的变化(将来的需求谁都不清楚啊……),就无法满足了。

最近实现的一系列功能(权限管理,索引持久化等)都涉及到了持久化问题

之前做了一个基于XML的管理插件,只需要在第一次读取的时候使用到XML,之后数据来自缓存,这样可以满足权限管理的功能,但是一旦权限发生动态的变化(将来的需求谁都不清楚啊……),就无法满足了。

且,XML对于索引持久化支持还是不太够,主要体现在索引重构功能点上。当索引文件有成百上千个的时候,等待重新读写、生成XML文件的时间非常非常难受。

再就是,最近又开始涉及到web引用,权限管理后台重新归纳了下需求,期望加入对后台本身的权限管理,发现需要进行大量的代码重编,主要是涉及到重写SQL,工作量略大。

所以,综上考虑,要快速的读写——数据库,要符合Java程序员的思路的代码风格——hibernate。

 

今天学习了下hibernate,看下配置心得吧。

 

首先推荐一个网站:

http://grepcode.com

这个网站的开源项目很全,基本涵盖了大部分开源项目的大部分版本,有源码,部分有文档。可以下载,也可以在线看。

最好的一点是,对当前项目的依赖性和常用项目做了归纳。

 

从这里我下载到了hibernate的一些依赖包。

首先是hibernate本身:

hibernate-3.2.7.ga.jar

 

然后是其它依赖的jar包:

antlr-2.7.6.jar

asm-all-3.3.1.jar (注意需要的是all版本)

c3p0-0.9.1.jar

cglib-2.2.2.jar(这里推荐使用2.2及以上版本,在2.1版本中会出现反射调用找不到asm中某个类方法的问题)

commons-collections-2.1.1.jar

commons-logging-1.0.4.jar

concurrent-1.3.4.jar

dom4j-1.6.1.jar

jboss-cache-1.2.2.jar(非必须)

jgroups-all-2.2.8.jar(非必须)

jta-1.1.jar

 

第一次学习,参考的书籍是《HIBERNATE - 符合Java习惯的关系数据库持久化》

 

现在记录一下配置Hibernate的注意事项:

1、事务类必须是符合Bean规范的,即是setter和getter要满足规范,我们知道hibernate是通过XML配置的内容使用反射来对类进行表-类映射的,即是说它一定有严格的格式要求。

2、*.hbm.xml文件是针对的类的mapping映射文件,.hbm.xml是约定俗成的后缀名,最好不要修改。

格式:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
[...]
</hibernate-mapping>

这个文件的位置并不一定要和类放在一起,它的位置是被hibernate.cfg.xml指定的(当然,配置hibernate有多种方式,properties或者程序制定都是可以的)

映射配置:

<mapping resource="events/Event.hbm.xml"/>

3、hibernate.cfg.xml,这是hibernate的配置文件,它用于指定数据,建立sessionFactory,配置映射文件位置,配置连接池等。

注意一点,hibernate.cfg.xml是个缺省名,你可以任意指定一个名来完成配置。

通过new Configuration().configure(String path);来完成,注意有没有“/”开头的path都是一个效果。

我们来看看查找配置文件位置的代码:

    public static InputStream getResourceAsStream(String resource) {
        String stripped = resource.startsWith("/") ?
                resource.substring(1) : resource;

        InputStream stream = null;
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        if (classLoader!=null) {
            stream = classLoader.getResourceAsStream( stripped );
        }
        if ( stream == null ) {
            stream = Environment.class.getResourceAsStream( resource );
        }
        if ( stream == null ) {
            stream = Environment.class.getClassLoader().getResourceAsStream( stripped );
        }
        if ( stream == null ) {
            throw new HibernateException( resource + " not found" );
        }
        return stream;
    }

嗯,它不支持绝对路径。当然在实际应用中绝对路径是没用的。

当然我们也可以自己定义自己期望的寻址方式(估计之后要做的插件化里就需要做这个),比如我自己顺手写了个测试:

package myhibernate;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Configuration;
import org.hibernate.util.ConfigHelper;

public class MyConfiguration extends Configuration {
    /**
     * 
     */
    private static final long serialVersionUID = 4590539009267996973L;
    private static Log log = LogFactory.getLog(MyConfiguration.class);

    protected InputStream getConfigurationInputStream(String resource)
            throws HibernateException {

        log.info("Configuration resource: " + resource);

        try {
            return new FileInputStream(resource);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return ConfigHelper.getResourceAsStream(resource);
    }
}

如此,就可以在项目根目录找到.cfg.xml文件了。

同理的,如果对addResources进行重写,就可以修改.hbm.xml映射文件的寻址位置了

如下:

    public Configuration addResource(String resourceName)
            throws MappingException {
        try {
            return addInputStream(new FileInputStream(resourceName));
        } catch (MappingException me) {
            throw new InvalidMappingException("resource", resourceName, me);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return super.addResource(resourceName);
    }

 

 

以上,则完成了hibernate的配置。

但是在开发的时候,.cfg.xml文件需要出现在.class能找到的位置上,即是说,src文件夹是不可取的。

所以,我们需要把他们放置在合用的位置,比如bin。

使用eclipse,myeclipse就没有这些烦恼。

 

 

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

其他文章