2

我正在开发一个新的 Oracle ADF 项目,该项目使用 Oragle 10g 数据库,并且我在我们的项目中使用 Unitils 和 DBMaintainer 用于:

  • 更新数据库结构
  • 单元测试
  • 读入种子数据
  • 读入测试数据
  • 项目清单

在我们的项目中,我们有 2 个模式和 2 个具有连接这些模式的权限的 db 用户。我将它们放在具有递增名称的文件夹结构中,并且我使用@convention 进行脚本命名。

001_@schemaA_name.sql 
002_@schemaB_name.sql 
003_@schemaA_name.sql 

这适用于 ant 和 DBMaintainer 更新任务,我通过为 ant 任务配置额外元素来提供多个用户名。

<target name="create" depends="users-drop, users-create" description="This tasks ... ">
    <updateDatabase scriptLocations="${dbscript.maintainer.dir}" autoCreateDbMaintainScriptsTable="true">
       <database name="${db.user.dans}" driverClassName="${driver}" userName="${db.user.dans}" password="${db.user.dans.pwd}" url="${db.url.full}" schemaNames="${db.user.dans}" />
        <database name="idp" driverClassName="${driver}" userName="${db.user.idp}"
            password="${db.user.idp.pwd}" url="${db.url.full}" schemaNames="${db.user.idp}" />
    </updateDatabase>
</target>

但是,我想不通,如何让 DBMaintainer 更新任务从我的数据库模式创建 xsd 模式?

所以,我决定使用 Unitils,因为它的更新创建了 xsd 模式。我还没有找到 Unitils ant 任务的任何描述或文档 - 任何人都可以提供一些提示吗?目前我已经想出通过创建一个带有 @Dataset 注释的 Junit 测试来运行 Unitils。我可以让它与一个模式和一个数据库用户一起工作。但是我不知道如何使它与多个用户一起使用?

这是我拥有的 unitils-local.properties 设置:

database.url=jdbc\:oracle\:thin\:@localhost\:1521\:vipu
database.schemaNames=a,b
database.userName=a
database.password=a1

你们中的任何人都可以给我一个提示,如何使 Unitils 与第二个用户/模式一起工作?我将非常感谢您的帮助!

4

4 回答 4

3

最终,我找到了一种方法来注入您选择的任何 unitil.properties --- 通过自己实例化 Unitils!

您需要一个调用@BeforeClass 的方法,在该方法中执行如下操作:

@BeforeClass
public void initializeUnitils {
    Properties properties;
    ...
    // load properties file/values depending on various conditions
    ...
    Unitils unitils = new Unitils();
    unitils.init(properties);
    Unitils.setInstance( unitils );     
}

我根据加载的休眠配置(通过@HibernateSessionFactory)选择属性文件,但也应该有其他选项

于 2011-07-03T08:03:00.297 回答
1

我已经弄清楚如何使 dbmaintain 和 unitils 在多数据库用户支持上协同工作,但解决方案是纯 ant hack。

  1. 我已经使用多数据库用户支持设置了 dbmaintain 的配置。
  2. 我制作了一个带有用于替换的令牌密钥的 unitils-local.properties 文件。
  3. 我的 ant 脚本的 init 目标正在生成一个新的 unitils-local.properties 文件,方法是将用户名/密码/模式的标记替换为目标环境的正确值,然后将其复制到用户主目录。
  4. 我已将测试分类到以架构名称为前缀的文件夹中
  5. 当 unitils 被调用时,它会获取刚刚由 ant 脚本创建的 unitils-local.properties 文件,并发挥它的作用。

它远非漂亮,但它有效。

于 2011-05-31T13:40:09.103 回答
0

查看此链接:http ://www.dbmaintain.org/tutorial.html#From_Java_code

具体来说,您可能需要执行以下操作:

databases.names=admin,user,read
database.driverClassName=oracle.jdbc.driver.OracleDriver
database.url=jdbc:oracle:thin://mydb:1521:MYDB
database.admin.username=admin
database.admin.password=adminpwd
database.admin.schemaNames=admin
database.user.userName=user
database.user.password=userpwd
database.user.schemaNames=user
database.read.userName=read
database.read.password=readpwd
database.read.schemaNames=read

此链接也可能会有所帮助:http ://www.dbmaintain.org/tutorial.html#Multi-database__user_support

于 2011-05-26T18:51:08.230 回答
0

我听从了瑞恩的建议。当我调试 UnitilsDB 时,我注意到了一些变化。

以下是我正在运行的 unitils-local.properties:

database.names=db1,db2
database.driverClassName.db1=oracle.jdbc.driver.OracleDriver
database.url.db1=jdbc:oracle:thin:@db1d.company.com:123:db1d
database.userName.db1=user
database.password.db1=password
database.dialect.db1=oracle
database.schemaNames.db1=user_admin

database.driverClassName.db2=oracle.jdbc.driver.OracleDriver
database.url.db2=jdbc:oracle:thin:@db2s.company.com:456:db2s
database.userName.db2=user
database.password.db2=password
database.dialect.db2=oracle

确保使用 @ConfigurationProperties(prefix = "database.db1") 连接到测试用例中的特定数据库:

@RunWith(UnitilsJUnit4TestClassRunner.class)
@ConfigurationProperties(prefix = "database.db1")
@Transactional
@DataSet
public class MyDAOTest {

..

}
于 2018-02-15T16:07:55.140 回答