2011-05-09 65 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 { 

.. 

} 
相關問題