学习:配置hibernate
最近实现的一系列功能(权限管理,索引持久化等)都涉及到了持久化问题
之前做了一个基于XML的管理插件,只需要在第一次读取的时候使用到XML,之后数据来自缓存,这样可以满足权限管理的功能,但是一旦权限发生动态的变化(将来的需求谁都不清楚啊……),就无法满足了。
且,XML对于索引持久化支持还是不太够,主要体现在索引重构功能点上。当索引文件有成百上千个的时候,等待重新读写、生成XML文件的时间非常非常难受。
再就是,最近又开始涉及到web引用,权限管理后台重新归纳了下需求,期望加入对后台本身的权限管理,发现需要进行大量的代码重编,主要是涉及到重写SQL,工作量略大。
所以,综上考虑,要快速的读写——数据库,要符合Java程序员的思路的代码风格——hibernate。
今天学习了下hibernate,看下配置心得吧。
首先推荐一个网站:
这个网站的开源项目很全,基本涵盖了大部分开源项目的大部分版本,有源码,部分有文档。可以下载,也可以在线看。
最好的一点是,对当前项目的依赖性和常用项目做了归纳。
从这里我下载到了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就没有这些烦恼。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)