Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate映射,包括介绍设置HSQLDB等方面。
我曾对Hibernate有很深刻的印象,但我遇到的一个问题是,在使用Hibernate进行单元测试的数据映射时,设法插入一个间接层。该附加层非常脆弱,编写起来感到非常困难。实际部署版本简单地通过了特定于Hibernate的实现。更坏的情况是,模拟版本比真正的“产品级”版本更复杂,只因为模拟版本里没有基本对象存储器和带有Hibernate映射。
我也使用很多复杂的Hibernate查询,想要对应用程序的重要部分进行单元测试。然而,对活动的数据库进行测试不是好主意,因为这几乎总是产生维护问题。另外,由于测试***互相独立,在测试上下文数据中使用相同的主键意味着必须在每次测试前创建代码来清理数据库,当涉及到大量关系时就成为一个实际问题。
通过使用HSQLDB和Hibernate强大的模式生成工具,能够对应用程序映射层进行单元测试,并在对象查询中找到不计其数的bug,这在以前手工测试时是做不到的。利用下面的技术概述,可以在开发过程中对整个应用程序进行测试,并且在测试有效区域内没有损害。
设置HSQLDB
以前使用HSQLDB 1.7.3.0 版。为了使用数据库的内存版本,需要激活org.hsqldb.jdbcDriver的静态加载程序。当获得JDBC连接时,就可以使用JDBC url例如jdbc:hspldb:mem:yourdb,这里’yourdb’就是想要使用的内存数据库的名称。
因为使用Hibernate (3.0 beta 4),所以我几乎无需接触实际活动的JDBC对象。相反,我可以让Hibernate完成很多繁重的任务,包括从Hibernate映射文件中自动创建数据库模式。因为Hibernate创建自身专有的连接池,所以它会基于TestSchema类中的配置代码自动加载HSQLDB JDBC驱动程序。下面就是该类的静态的初始化程序。
- public class TestSchema {
- static {
- Configuration config = new Configuration().
- setProperty("hibernate.dialect", "org.hibernate.dialect.HSQLDialect").
- setProperty("hibernate.connection.driver_class", "org.hsqldb.jdbcDriver").
- setProperty("hibernate.connection.url", "jdbc:hsqldb:mem:baseball").
- setProperty("hibernate.connection.username", "sa").
- setProperty("hibernate.connection.password", "").
- setProperty("hibernate.connection.pool_size", "1").
- setProperty("hibernate.connection.autocommit", "true").
- setProperty("hibernate.cache.provider_class", "
org.hibernate.cache.HashtableCacheProvider").- setProperty("hibernate.hbm2ddl.auto", "create-drop").
- setProperty("hibernate.show_sql", "true").
- addClass(Player.class).
- addClass(BattingStint.class).
- addClass(FieldingStint.class).
- addClass(PitchingStint.class);
- HibernateUtil.setSessionFactory(config.buildSessionFactory());
- }
【编辑推荐】