zoukankan      html  css  js  c++  java
  • 学习:配置hibernate

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

    之前做了一个基于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就没有这些烦恼。

     

  • 相关阅读:
    海思HISI 3518EV200 AEC回音消除+ANR语音降噪(转)
    重磅消息 | 2020年最新全栈测试开发技能实战指南(第1期)
    推荐一款Python开源库,技术人必备的造数据神器!
    DevOps研发模式下「产品质量度量」方案实践
    自动化测试实战技巧:「用例失败重试机制」实现方案分享
    C#/VB.NET 在Word中添加条码、二维码
    Java 在PDF中绘制形状(基于Spire.Cloud.SDK for Java)
    Java 添加条码、二维码到Word文档
    Java 添加、下载、读取PDF附件信息(基于Spire.Cloud.SDK for Java)
    Java 添加、提取PDF中的图片
  • 原文地址:https://www.cnblogs.com/anrainie/p/2513470.html
Copyright © 2011-2022 走看看