目录:
#1学习hibernate 3.0版本源码#2 hibernate 类的简单介绍
#3 hibernate jar包简单介绍
目录:
#1学习hibernate 3.0版本源码
#2 hibernate 类的简单介绍
#3 hibernate jar包简单介绍
#3 hibernate jar包简单介绍
Hibernate一共包括了23个jar包,令人眼花缭乱。本文将详细讲解
Hibernate每个jar包的作用,便于你在应用中根据自己的需要进行取舍。
下载
Hibernate,例如2.0.3稳定版本,解压缩,可以看到一个hibernate2.jar和lib目录下有22个jar包:
- hibernate2.jar:
Hibernate的库,没有什么可说的,必须使用的jar包
- cglib-asm.jar:
CGLIB库,
Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar包
- dom4j.jar:
dom4j是一个Java的
XML API,类似于jdom,用来读写
XML文件的。dom4j是一个非常非常优秀的Java
XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java
XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j,直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写
XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包,
Hibernate用它来读写配置文件。
- odmg.jar:
ODMG是一个ORM的规范,
Hibernate实现了ODMG规范,这是一个核心的库,必须使用的jar包。
- commons-collections.jar:
Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。
- commons-beanutils.jar:
Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。
- commons-lang.jar:
Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。
- commons-logging.jar:
Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本身包含了一个Simple Logger,但是功能很弱。在运行的时候它会先在CLASSPATH找log4j,如果有,就使用log4j,如果没有,就找JDK1.4带的java.util.logging,如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾,当初Apache极力游说Sun把log4j加入JDK1.4,然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了,因此拒绝了Apache的要求,使用自己的java.util.logging,这个包的功能比log4j差的很远,性能也一般。后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的log程序,底层的Logger是可以切换的,你可以选择log4j,java.util.logging或者它自带的Simple Logger。不过我仍然强烈建议使用log4j,因为log4j性能很高,log输出信息时间几乎等于System.out,而处理一条log平均只需要5us。你可以在
Hibernate的src目录下找到
Hibernate已经为你准备好了的log4j的配置文件,你只需要到Apache 网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。
使用
Hibernate必须的jar包就是以上的这几个,剩下的都是可选的。
- ant.jar:
- optional.jar:
Ant的一个辅助包。
- c3p0.jar:
C3PO是一个数据库连接池,
Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池,就需要这个jar包。
- proxool.jar:
也是一个连接池,同上。
- commons-pool.jar, commons-dbcp.jar:
DBCP数据库连接池,Apache的Jakarta组织开发的,
Tomcat4的连接池也是DBCP。
实际上
Hibernate自己也实现了一个非常非常简单的数据库连接池,加上上面3个,你实际上可以在
Hibernate上选择4种不同的数据库连接池,选择哪一个看个人的偏好,不过DBCP可能更通用一些。另外强调一点,如果在
EJB中使用
Hibernate,一定要用App Server的连接池,不要用以上4种连接池,否则容器管理事务不起作用。
- connector.jar:
JCA 规范,如果你在App Server上把
Hibernate配置为Connector的话,就需要这个jar。不过实际上一般App Server肯定会带上这个包,所以实际上是多余的包。
- jaas.jar:
JAAS是用来进行权限验证的,已经包含在JDK1.4里面了。所以实际上是多余的包。
- jcs.jar:
如果你准备在
Hibernate中使用JCS的话,那么必须包括它,否则就不用。
- jdbc2_0-stdext.jar:
JDBC2.0的扩展包,一般来说数据库连接池会用上它。不过App Server都会带上,所以也是多余的。
- jta.jar:
JTA规范,当
Hibernate使用JTA的时候需要,不过App Server都会带上,所以也是多余的。
- junit.jar:
Junit包,当你运行
Hibernate自带的测试代码的时候需要,否则就不用。
- xalan.jar, xerces.jar, xml-apis.jar:
Xerces是
XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上,JDK1.4也包含了解析器,不过不是Xerces,是Crimson,效率比较差,不过
Hibernate用
XML只不过是读取配置文件,性能没什么紧要的,所以也是多余的。
#2 hibernate 类的简单介绍
hibernate学习2(转贴别人的一段文章 类的简单介绍)
看了些源代码,写了些记录。发表出来,希望初学者有用。如有不对的地方,请指正。
Setting类:数据库,连接池设置的Bean,主要是各种参数的set&get方法。
Environment类:环境参数定义。(常量)
NamingStratgy:命名规则定义的接口。
DefaultNamingStrategy:默认命名规则。(实现NamingStratgy接口)
ImprovedNamingStrategy:改善命名规则。(实现NamingStratgy接口)就是加下划线。其中有个addUnderscores()方法。
Setting类:数据库,连接池设置的Bean,主要是各种参数的set&get方法。
Environment类:环境参数定义。(常量)
NamingStratgy:命名规则定义的接口。
DefaultNamingStrategy:默认命名规则。(实现NamingStratgy接口)
ImprovedNamingStrategy:改善命名规则。(实现NamingStratgy接口)就是加下划线。其中有个addUnderscores()方法。
private String addUnderscores(String name) {
StringBuffer buf = new StringBuffer( name.replace('.', '_') );
for (int i=1; i <buf.length()-1; i++) {
if (
'_'!=buf.charAt(i-1) &&
Character.isUpperCase( buf.charAt(i) ) &&
!Character.isUpperCase( buf.charAt(i+1) )
) {
buf.insert(i++, '_');
}
}
return buf.toString().toLowerCase();
}
StringBuffer buf = new StringBuffer( name.replace('.', '_') );
for (int i=1; i <buf.length()-1; i++) {
if (
'_'!=buf.charAt(i-1) &&
Character.isUpperCase( buf.charAt(i) ) &&
!Character.isUpperCase( buf.charAt(i+1) )
) {
buf.insert(i++, '_');
}
}
return buf.toString().toLowerCase();
}
按大写分开,加上"_",然后返回小写的toString();
SettingFactory类:设置属性类。其中有buildSettings(Properties properties)方法,设置自定义属性。
Mapping类:有点不清楚。设置类和表之间的映射。class 进去,table出来。:)(了解不清晰。)
Binding类:PO和数据库中表及其之间的映射的绑定。
Configuration类,配置类Configuration()构建器,调用reset(),重置参数。
SettingFactory类:设置属性类。其中有buildSettings(Properties properties)方法,设置自定义属性。
Mapping类:有点不清楚。设置类和表之间的映射。class 进去,table出来。:)(了解不清晰。)
Binding类:PO和数据库中表及其之间的映射的绑定。
Configuration类,配置类Configuration()构建器,调用reset(),重置参数。
还有addClass(),addFile(),add(document.nbsp;doc) ,addDirectory(),addJar(),addInputString(),addResoure()等一系列方法,通过不同的资源进行配置。
还有通过不同参数重构了许多configure()方法。configure()通过hibernate.cfg.xml配置。
public Configuration configure() throws HibernateException {
configure( "/hibernate.cfg.xml");
return this;
}
然后比较重要的是生成SessionFactory;
public SessionFactory buildSessionFactory() throws HibernateException {
secondPassCompile();
validate();
Environment.verifyProperties(properties);
Properties copy = new Properties();
copy.putAll(properties);
Settings settings = buildSettings();
configureCaches(settings);
return new SessionFactoryImpl(this, settings);
}
其他的一些就是通过配置文件设置各种属性。比如数据库方言Dialect等。
我再主要研究一下Configuration类 在学习四中推出。
#1 hibernate源码学习
学习hibernate源码 20051229
学习的为hibernate 3.0版本
准备 如果使用eclipse3 .1 Myeclipse 4.0只要新建一个工程,选择add hibernate 根据情况配置一下即可。
如果使用jbuilder 我不知道,然后从 www.hibernate.org上下载源码。
开始读代码
工程中 配置了hibernate后,hibernate.cfg.xml需要自己配置一下,我的数据库配置如下
<--------------------------------------------------------------------------------------------->
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
学习的为hibernate 3.0版本
准备 如果使用eclipse3 .1 Myeclipse 4.0只要新建一个工程,选择add hibernate 根据情况配置一下即可。
如果使用jbuilder 我不知道,然后从 www.hibernate.org上下载源码。
开始读代码
工程中 配置了hibernate后,hibernate.cfg.xml需要自己配置一下,我的数据库配置如下
<--------------------------------------------------------------------------------------------->
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools. -->
<hibernate-configuration>
<session-factory>
<property name="myeclipse.connection.profile">My222</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:orac
</property>
<property name="connection.username">system</property>
<property name="connection.password">weblogic</property>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="myeclipse.connection.profile">My222</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:orac
</property>
<property name="connection.username">system</property>
<property name="connection.password">weblogic</property>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
</session-factory>
</hibernate-configuration>
<--------------------------------------------------------------------------------------------->
然后,就可以直接使用 如下文方法来获得当前连接了HibernateSession.currentSession()。
<--------------------------------------------------------------------------------------------->
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
/**
*标准的格式,来获得hibernate的session
*/
public class HibernateSession {
/**
* 默认的hibernate路径
*/
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
*标准的格式,来获得hibernate的session
*/
public class HibernateSession {
/**
* 默认的hibernate路径
*/
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
/** 其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,
* 是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
* 就是实现一个线程一个session
*/
private static final ThreadLocal threadLocal = new ThreadLocal();
* 是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
* 就是实现一个线程一个session
*/
private static final ThreadLocal threadLocal = new ThreadLocal();
/** 配置文件*/
private static final Configuration cfg = new Configuration();
private static final Configuration cfg = new Configuration();
/** 提供一个session的工厂类 */
private static org.hibernate.SessionFactory sessionFactory;
private static org.hibernate.SessionFactory sessionFactory;
/**
* 返回当前session
* 如果没有当前session则新建一个session,
* 并保存到threadlocal变量中。
* @throws HibernateException
*/
public static Session currentSession() throws HibernateException {
Session session = (Session) threadLocal.get();
* 返回当前session
* 如果没有当前session则新建一个session,
* 并保存到threadlocal变量中。
* @throws HibernateException
*/
public static Session currentSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null) {
if (sessionFactory == null) {
try {
cfg.configure(CONFIG_FILE_LOCATION);
sessionFactory = cfg.buildSessionFactory();
}
catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
/**
* 关闭session
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (sessionFactory == null) {
try {
cfg.configure(CONFIG_FILE_LOCATION);
sessionFactory = cfg.buildSessionFactory();
}
catch (Exception e) {
System.err.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
/**
* 关闭session
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
/**
* Default constructor.
* 声明为private 防止被随便实例化
* 扰乱当前threadlocal
*/
private HibernateSession() {
}
}
<--------------------------------------------------------------------------------------------->
下面就看看,调用HibernateSession.currentSession()时到底干了什么。
首先实例化 HibernateSession类
1。CONFIG_FILE_LOCATION默认为"/hibernate.cfg.xml";
2。创建了threadlocal对象量;
3。创建Configuration的对象cfg调用了Configuration 的constructor 让我们看看
默认的构造器,创建了一个SettingsFactory,然后调用下面的构造器
public Configuration() {
this( new SettingsFactory() );
}
protected Configuration(SettingsFactory settingsFactory) {
this.settingsFactory = settingsFactory;
reset();
}
其实就是创建了SettingsFactory对象,并对Configuration进行了reset,清空上次遗留的属性。
4。执行HibernateSession.currentSession()
session.close();
}
}
/**
* Default constructor.
* 声明为private 防止被随便实例化
* 扰乱当前threadlocal
*/
private HibernateSession() {
}
}
<--------------------------------------------------------------------------------------------->
下面就看看,调用HibernateSession.currentSession()时到底干了什么。
首先实例化 HibernateSession类
1。CONFIG_FILE_LOCATION默认为"/hibernate.cfg.xml";
2。创建了threadlocal对象量;
3。创建Configuration的对象cfg调用了Configuration 的constructor 让我们看看
默认的构造器,创建了一个SettingsFactory,然后调用下面的构造器
public Configuration() {
this( new SettingsFactory() );
}
protected Configuration(SettingsFactory settingsFactory) {
this.settingsFactory = settingsFactory;
reset();
}
其实就是创建了SettingsFactory对象,并对Configuration进行了reset,清空上次遗留的属性。
4。执行HibernateSession.currentSession()