为生产和测试配置hibernate

时间:2011-07-03 11:07:24

标签: hibernate testing configuration production

在我的网络应用程序中,我使用hibernate和hsqldb进行数据库操作......并使用Ant进行构建管理。我有一个包含db.url,db.driver等的local.properties。它们包含生产数据库值。

在hibernate.cfg.xml中,我再次将这些db参数作为SessionFactory元素内的属性提供。

在Ant构建文件中,我使用local.properties作为属性文件,这样我就可以创建一个启动db的目标。

最后,在我的dao实现中,我使用HibernateUtil类来创建会话工厂 有了这些,我就可以访问myappdb。

我的问题是,我需要使用不同的数据库进行测试。 我有一些junit测试类和一些需要在myapptestdb上工作的cactus测试。目前我正在做的是用testdb值替换local.properties和hibernate.cfg.xml中的所有db相关参数。

即,用myapptestdb等替换myappdb。 我知道,这不是正确的方法。有人建议更好的解决方案吗?

提前感谢,

标记

我的项目中各种配置文件的相关部分如下所示。

local.properties

   db.driver=org.hsqldb.jdbcDriver
    db.server.class=org.hsqldb.server.Server
    db.url=jdbc:hsqldb:hsql://localhost:9005/myappdb
    db.username=SA
    db.password=SA
    hport=9005
    dir.data=data
    halias=myappdb
    hjar=lib/hsqldb.jar
    hfile=--database.0 data/myappdb
   ...

的hibernate.cfg.xml

<session-factory>
<property name="connection.driver_class">
    org.hsqldb.jdbcDriver
</property>
<property name="connection.url">
    jdbc:hsqldb:hsql://localhost:9005/myappdb;create=true
</property>
<property name="connection.username">SA</property>
<property name="connection.password">SA</property>
...
</session-factory>

的build.xml

<property file="local.properties" />
...
<target name="startdb" description="start hsqldb in server mode">
        <java fork="true" classname="${db.server.class}"  >
            <classpath>
                <path location="${dir.lib}/hsqldb.jar"/>
            </classpath>
            <arg value="-database.0"/>
            <arg value="${dir.data}/${halias}"/>
            <arg value="-dbname.0"/>
            <arg value="${halias}"/>
            <arg value="-port"/>
            <arg value="${hport}"/>
        </java>
    </target>

MyDaoImpl.java

class MyDaoImpl implements MyDao {
    ...
    @Override
    public Object findById(Long id) {
        SessionFactory factory = HibernateUtil.getSessionFactory();
        Session session = factory.openSession();
        Object object = null;
        try {
            object = (Object) session.get(persistentClass, id);
            return object;
        } finally {
            session.close();
        }
    }
...
}

HibernateUtil.java

class HibernateUtil {
    private static SessionFactory sessionFactory;
    public static SessionFactory getSessionFactory() {      
        if (sessionFactory == null){
            try{
                Configuration configuration = new Configuration().configure();
                sessionFactory = configuration.buildSessionFactory();               
            }catch(HibernateException e){
                e.printStackTrace();
                throw e;
            }
        }

        return sessionFactory;
    }
}

2 个答案:

答案 0 :(得分:2)

两个建议:

1)转移到Maven。在那里,您可以定义<profiles/>,它允许您配置不同环境的设置(例如,开发,测试,集成测试,生产)。 (我不是说你不能用Ant做这个;但是在Maven下它更自然,它不需要很多设置)。您还可以使用资源过滤。生产和测试代码之间也存在分离,而不必遵循惯例。

2)在Ant中,您可以拥有属性文件的两个单独副本(位于不同的文件夹中或以不同的名称),并选择一个以您需要的名称进行复制 - 避免以编程方式更改内容。您可以通过在构建执行时传入属性来完成此操作。

答案 1 :(得分:1)

@ markjason72: - 几点想法: - i)对于ant,为什么你认为存储在local.properties中的db信息是个坏主意?我认为这是正确的方式。 您可以创建不同版本的属性文件,如local_dev.properties,local_test1.properties,local_prod.properties。并根据环境使用build.xml文件。

ii)对于hibernate,您实际上可以共享上面为ant配置的属性文件,并从hibernate.cfg.xml文件中删除这些属性。您可以参考hibernate property configuration了解更多详情。