在我的网络应用程序中,我使用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;
}
}
答案 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了解更多详情。