2011-05-09 28 views
2

我上一个新的Oracle ADF项目中工作,正在使用Oragle 10g数据库,和我使用Unitils和DBMaintainer在我们的项目为:单元和DBMaintainer - 如何使它们与多个用户/模式一起工作?

  • 更新数据库结构
  • 单元测试
  • 在读种子数据
  • 测试数据读取
  • 列表项

在我们的项目,我们有2个SC hemas和2分贝用户有权连接到这些模式。我将它们放在具有增量名称的文件夹结构中,我使用@convention进行脚本命名。

[email protected]_name.sql 
[email protected]_name.sql 
[email protected]_name.sql 

这正常工作与蚂蚁和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蚂蚁任务的任何描述或文档 - 任何人都可以提供一些提示吗? 目前我已经想通过使用@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与第二用户/架构工作吗? 我会非常感谢你的帮助!

回答

1

我必须弄清楚如何使dbmaintain和单位一起工作在多数据库用户支持,但解决方案是一个纯粹的蚂蚁黑客。

  1. 我已经使用多数据库用户支持设置了dbmaintain的配置。
  2. 我已经使用令牌密钥进行了替换的unitils-local.properties文件。
  3. 我的ant脚本的init目标正在生成一个新的unitils-local.properties文件,通过替换用于目标环境的正确值的用户名/密码/模式标记,然后将其复制到用户主目录。
  4. 我已经将测试排序到以模式名称为前缀的文件夹中
  5. 调用单元时,它会拾取刚才由ant脚本创建的unitils-local.properties文件,并发挥它的魔力。

它很不漂亮,但它的作品。

+0

我正在寻找一个这样的程序化解决方案(在生产unitils.properties的程度上),但最终得出了类似的结论 – prusswan 2011-06-30 16:01:07

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

+0

是的,我知道这个多数据库DBMaintain配置。问题在于,Unitils使用DBMaintain作为子模块,但似乎并未兑现多数据库配置。 – themathmagician 2011-05-31 13:29:44

+0

有趣。是的,我一直在Unitils的dbMaintain模块遇到类似的问题,它的行为与dbMaintain网站上记录的不一样。在这里看到我的问题:[链接](http://stackoverflow.com/questions/6143505/using-unitils-dbmaintain-to-maintain-database-how-to-exclude-scripts-from-being)。我在这一点上的假设是Unitils正在使用较旧版本的dbMaintain。 – 2011-05-31 14:34:43

+0

后续行动:我的假设是正确的。 Unitils正在使用旧版本的dbMaintain。看到这里:http://stackoverflow.com/a/6414416/411229 – 2012-02-21 20:01:15

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);  
} 

我选择,这取决于Hibernate配置被加载(通过@HibernateSessionFactory)的属性文件,但有应该是其他选项以及

+0

看起来像这样不包括诸如“@TestDataSource private DataSource dataSource;' - 数据源将是'null'的注入。太糟糕了。 – mgaert 2013-10-01 12:08:18

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”),以connecto到特定的数据库在你的测试用例:

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

.. 

} 
相关问题