副标题#e#
Hibernate 是一个风行的开源工具干系映射东西,单位测试和一连集成的重要性也获得了遍及的推广和认同,在回收了Hibernate的项目中如何担保测试的自动化和一连性呢?本文接头了Hibernate加载其设置文件hibernate.properties和hibernate.cfg.xml的进程,以及怎么样将hibernate提供的设置文件的会见要领机动运用到单位测试中。
先容
Hibernate 是一个风行的开源工具干系映射东西,单位测试和一连集成的重要性也获得了遍及的推广和认同,在回收了Hibernate的项目中如何担保测试的自动化和一连性呢?本文接头了Hibernate加载其设置文件hibernate.properties和hibernate.cfg.xml的进程,以及怎么样将hibernate提供的设置文件的会见要领机动运用到单位测试中。留意:本文以hibernate2.1作为接头的基本,不担保本文的概念适合于其他版本。
读者
Java开拓人员,要求熟悉JUnit和把握Hibernate的基本常识
内容
1.筹备
对付hibernate的初学者来说,第一次利用hibernate的履历凡是是:
1) 安装设置好Hibernate,我们后头将%HIBERNATE_HOME%作为对Hibernate安装目次的引用,
2) 开始建设好本身的第一个例子,譬喻hibernate手册内里的类Cat,
3) 设置好hbm映射文件(譬喻Cat.hbm.xml,本文不接头这个文件内设置项的寄义)和数据库(如hsqldb),
4) 在项目标classpath路径下添加一个hibernate.cfg.xml文件,如下(第一次利用hibernate最常见的设置内容):
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
<property name="dialect">net.sf.hibernate.dialect.HSQLDialect</property>
<property name="hibernate.show_sql">false</property>
<mapping resource="Cat.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5) 然后还需要提供一个类来测试一下建设,更新,删除和查询Cat,对付熟悉JUnit的开拓人员,可以建设一个单位测试类来举办测试,如下:
import junit.framework.TestCase;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.cfg.Configuration;
public class CatTest extends TestCase {
private Session session;
private Transaction tx;
protected void setUp() throws Exception {
Configuration cfg = new Configuration().configure();////留意这一行,这是本文重点接头研究的处所。
session = cfg.buildSessionFactory().openSession();
tx = session.beginTransaction();
}
protected void tearDown() throws Exception {
tx.commit();
session.close();
}
public void testCreate() {
//请在此要领内添加相关的代码,本文不接头怎么样利用Hibernate API。
}
public void testUpdate() {
//请在此要领内添加相关的代码,本文不接头怎么样利用Hibernate API。
}
public void testDelete() {
//请在此要领内添加相关的代码,本文不接头怎么样利用Hibernate API。
}
public void testQuery() {
//请在此要领内添加相关的代码,本文不接头怎么样利用Hibernate API。
}
}
#p#副标题#e#
2、new Configuration()都做了什么?
对付第一次利用hibernate的新手来说,下面的这段代码可以说是最常见的利用Configuration方法。
Configuration cfg = new Configuration().configure();
Configuration是hibernate的进口,在新建一个Configuration的实例的时候,hibernate会在classpath内里查找hibernate.properties文件,假如该文件存在,则将该文件的内容加载到一个Properties的实例GLOBAL_PROPERTIES内里,假如不存在,将打印信息
hibernate.properties not found
然后是将所有系统情况变量(System.getProperties())也添加到GLOBAL_PROPERTIES内里( 注1)。假如hibernate.properties文件存在,系统还会验证一下这个文件设置的有效性,对付一些已经不支持的设置参数,系统将打印告诫信息。
3、configure()在做什么?
new Configuration()接头至此,下面接头configure()要领。
configure()要领默认会在classpath下面寻找hibernate.cfg.xml文件,假如没有找到该文件,系统会打印如下信息并抛出HibernateException异常。
hibernate.cfg.xml not found
#p#分页标题#e#
假如找到该文件,configure()要了解首先会见< session-factory >,并获取该元素的name属性,假如非空,将用这个设置的值来包围hibernate.properties的hibernate.session_factory_name的设置的值,从这里我们可以看出,hibernate.cfg.xml内里的设置信息可以包围hibernate.properties的设置信息。
接着configure()要了解见<session-factory>的子元素,首先将利用所有的<property>元素设置的信息( 注2),如前面我们利用的设置文件
<property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
<property name="dialect">net.sf.hibernate.dialect.HSQLDialect</property>
会包围hibernate.properties内里对应的设置,hibernate2.1宣布包内里自带的hibernate.properties文件(位于%HIBERNATE_HOME%/etc下面)内里的值,如下:
hibernate.dialect net.sf.hibernate.dialect.HSQLDialect
hibernate.connection.driver_class org.hsqldb.jdbcDriver
hibernate.connection.username sa
hibernate.connection.password
hibernate.connection.url jdbc:hsqldb:hsql://localhost
然后configure()会顺序会见以下几个元素的内容
<mapping>
<jcs-class-cache>
<jcs-collection-cache>
<collection-cache>
个中<mapping>是必不行少的,必需通过设置<mapping>,configure()才气会见到我们界说的java工具和干系数据库表的映射文件(hbm.xml),譬喻:
<mapping resource="Cat.hbm.xml"/>
通过以上的阐明,我们对hibernate设置文件hibernate.properties和hibernate.cfg.xml的默认的加载进程就较量清楚了。
4、Configuration的其他用法
Configuration的configure ()要领还支持带参数的会见方法,你可以指定hbm.xml文件的位置,而不是利用默认的classpath下面的hibernate.cfg.xml这种方法,譬喻:
Configuration cfg = new Configuration().configure("myexample.xml");
同时Configuration还提供了一系列要领用来定制hibernate的加载设置文件的进程,让你的应用越发机动,常用的是以下几种:
addProperties(Element)
addProperties(Properties)
setProperties(Properties)
setProperty(String, String)
通过以上几个要领,除了利用默认的hibernate.properties文件,你还可以提供多个.properties设置文件,利用Hibernate的时候按照差异的环境利用差异的设置文件,譬喻:
Properties properties = Properties.load("my.properties");
Configuration config = new Configuration().setProperties(properties).configure();
除了指定.properties文件之外,还可以指定.hbm.xml文件,下面列出几个常用的要领:
addClass(Class)
addFile(File)
addFile(String)
addURL(URL)
前面我们已经讲了,configure()要领默认是通过会见hibernate.cfg.xml的<mapping>元素来加载我们提供的.hbm.xml文件,上面列出的要领可以直接指定hbm.xml文件,譬喻addClass()要领可以直接通过指定class来加载对应的映射文件,hibernate会将提供的class的全名(包罗package)自动转化为文件路径,如net.sf.hibernate.examples.quickstart.Cat.class对应了net/sf/hibernate/examples/quickstart/Cat.hbm.xml,还可以用addFile要领直接指定映射文件。
例一:
Configuration config = new Configuration().addClass(Cat.class);
例二:
Configuration config = new Configuration().addURL(Configuration.class.getResource ("Cat.hbm.xml"));
例三:
Configuration config = new Configuration().addFile("Cat.hbm.xml");
5、总结
Configuration提供的这些要领的长处如下:
1) 一个应用中往往有许多.hbm.xml映射文件,开拓的进程中假如只是为了测试某个或几个Java PO(Persistence Object),我们没有须要把所有的.hbm.xml都加载到内存,这样可以通过addClass可能addFile直接,显得很是机动。
2) 进修Hibernate的进程中,往往需要通过操练来体会Hibernate提供的各类特征,而许多特征是需要修改设置文件的,假如要调查沟通的代码在差异的特征下的表示,就需要手工改设置文件,这样太贫苦了,并且容易堕落,我们可以提供多个设置文件,每个设置文件针对需要的特征而设置,这样我们在挪用措施的时候,把差异的设置文件作为参数通报进去,而措施代码内里利用setProperties和addFile指定传入的设置文件参数就可以了。
#p#分页标题#e#
3) 在单位测试中,出格是在集成测试内里,整个进程是自动化的,我们不妙手工过问测试进程,往往需要筹备多个设置文件针对差异的测试案例,这个时候setProperties和addFile要领就显得出格有用了,在差异的测试案例顶用这些要领来指定相应的设置文件,这样就可以做到自动化测试,担保了一连性。
6、应用举例
在刚开始进修hibernate的时候,对付hibernate的hbm映射文件里的各类设置参数没有一个感性的认识,譬喻inverse="true",lazy="true"这样的设置参数,不通过实践是无法体会到其浸染的,传统的要领就是每需要测试一种参数的结果就变动相应的设置文件,然后运行测试来调查功效,假如可以或许机动的运用Configuration提供的定制设置的要领,我们可以提供多个设置文件,每个设置文件内里有差异的设置参数,共同相应的测试案例就利便多了。 譬喻针对ono-to-many和many-to-one的双向关联的映射干系,我们想测试在one-to-many一方利用inverse="false"和inverse="true"的差异结果,假设已经正确的设置好了hibernate.properties,那么还需要提供两个差异的hbm.xml文件,假设别离名为bidirect.inverse.false.hbm.xml和bidirect.inverse.true.hbm.xml。
然后需要写两个差异的测试案例,别离针对两个差异的设置文件举办测试就可以了,这样的长处是,不消针对差异的测试案例修改设置文件,出格是在集成测试的时候,一切都是自动化的,假如每测试一个案例就需要手工去变动设置文件,这必定是一个失败的测试。 代码模板如下:
FalseInverseTest.java文件
import junit.framework.TestCase;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.cfg.Configuration;
/**
* test false inverse
*/
public class FalseInverseTest extends TestCase {
private Session session;
private Transaction tx;
protected void setUp() throws Exception {
Configuration cfg = new Configuration().addFile("bidirect.inverse.false.hbm.xml");
session = cfg.buildSessionFactory().openSession();
tx = session.beginTransaction();
}
protected void tearDown() throws Exception {
tx.commit();
session.close();
}
public void testLogic() {
//在此编写测试代码
}
}
TrueInverseTest.java文件
import junit.framework.TestCase;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;
import net.sf.hibernate.cfg.Configuration;
/**
* test true inverse
*/
public class TrueInverseTest extends TestCase {
private Session session;
private Transaction tx;
protected void setUp() throws Exception {
Configuration cfg = new Configuration().addFile("bidirect.inverse.true.hbm.xml");
session = cfg.buildSessionFactory().openSession();
tx = session.beginTransaction();
}
protected void tearDown() throws Exception {
tx.commit();
session.close();
}
public void testLogic() {
//在此编写测试代码
}
}
竣事语
通过对Hibernate默认的设置文件的加载顺序和Hibernate提供的加载设置文件的要领的接头,我们对在利用到Hibernate的项目标单位测试中利用多个Hibernate设置文件有了较量清楚的认识。
一连集成中的测试的特征是自动化和一连性,不妙手工过问其进程,在利用到Hibernate的项目假如要实现一连集成,就要为差异的测试案例提供差异的设置文件,而不是针对差异的测试案例举办手工调解,因此,在利用到Hibernate的项目中机动的运用多设置文件,可以提高测试的效率,担保自动化和一连性。