【问题标题】:configuring hibernate for production and testing为生产和测试配置休眠
【发布时间】:2011-09-27 14:21:15
【问题描述】:

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

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

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

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

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

即,将 myappdb 替换为 myapptestdb 等。 我知道,这不是正确的方法。有人可以为此提出更好的解决方案吗?

提前致谢,

标记

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

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>

构建.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;
    }
}

【问题讨论】:

    标签: hibernate testing configuration production


    【解决方案1】:

    两个建议:

    1) 移至 Maven。您可以在那里定义&lt;profiles/&gt;,它允许您为不同的环境(例如,开发、测试、集成测试、生产)配置设置。 (我并不是说你不能用 Ant 做到这一点;但在 Maven 下它更自然,不需要很多设置)。您还可以使用资源过滤。生产代码和测试代码之间也有分离,您只需遵循约定即可。

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

    【讨论】:

    • 感谢您的输入..即使我保留不同的属性文件副本,我仍然必须在每次要使用它们时编辑我的 hibernate.cfg.xml..或者有没有办法我可以让 hibernate.cfg.xml 从属性文件中获取值吗?
    • 如果你切换到 Maven,有一个叫做“资源过滤”的东西,它可以让你使用在不同的属性文件或 Maven 属性中定义的值。我强烈建议您考虑切换到 Maven。
    【解决方案2】:

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

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

    【讨论】:

    • @markjason72:如果您觉得评论有用,欢迎您点赞:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2010-11-08
    • 2013-04-27
    • 2014-02-11
    • 1970-01-01
    • 2015-07-28
    • 2016-05-06
    相关资源
    最近更新 更多