Unitils и DBMaintainer - как заставить их работать с несколькими пользователями / схемами? - PullRequest
2 голосов
/ 09 мая 2011

Я работаю над новым проектом Oracle ADF, в котором используется база данных Oragle 10g, и я использую Unitils и DBMaintainer в нашем проекте для:

  • обновление структуры БД
  • * 1006 модульное тестирование *
  • прочитано в начальных данных
  • прочитано в тестовых данных
  • Элемент списка

В нашем проекте у нас есть 2 схемы и пользователи 2 дБ, которые имеют право подключаться к этим схемам. У меня есть они в структуре папок с добавочными именами, и я использую @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 - кто-нибудь может дать какие-нибудь советы? В настоящее время я решил запустить Unitils, создав тест Junit с аннотацией @Dataset. Я могу заставить его работать с одной схемой и одним пользователем БД. Но у меня нет идей, как заставить его работать с несколькими пользователями?

Вот настройка unitils-local.properties, которую я имею:

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

Кто-нибудь из вас, ребята, может дать мне совет, как заставить Unitils работать со вторым пользователем / схемой? Буду очень признателен за вашу помощь!

Ответы [ 4 ]

3 голосов
/ 03 июля 2011

в конце концов я нашел способ внедрить любые свойства 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), но должны быть и другие опции

1 голос
/ 31 мая 2011

Я выяснил, как заставить dbmaintain и unitils работать вместе для поддержки нескольких пользователей базы данных, но решение - это чистый взлом муравья.

  1. Я настроил конфигурацию для dbmaintain,используя поддержку нескольких пользователей базы данных.
  2. Я создал файл unitils-local.properties с ключами токенов для замены.
  3. Цель init моего скрипта ant - создание нового unitils-localФайл .properties, заменяя токены для имени пользователя / пароля / схемы значениями, которые являются правильными для целевой среды, а затем копирует его в домашний каталог пользователей.
  4. Я отсортировал тесты по папкам с префиксомс именем схемы
  5. Когда вызывается unitils, он берет файл unitils-local.properties, только что созданный сценарием ant, и делает свое волшебство.

Это далеко не красиво, но это работает.

0 голосов
/ 15 февраля 2018

Я последовал совету Райана. Я заметил пару изменений, когда отлаживал 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 {

..

}
0 голосов
/ 26 мая 2011

Проверить эту ссылку: 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

...