Liquibase Change set кажется пустым при выполнении команды обновления

0

Прежде чем я объясню свою проблему, я должен заявить, что я новичок в Liquibase.

Я пытаюсь запустить метод обновления Liquibase в классе Test. Мой код читает файл набора изменений, получает блокировку, считывает из журнала изменений и освобождает блокировку, но не выполняет сам набор изменений. Здесь моя структура:

Класс испытания:

public class LiquibaseTestDbUtil {

    private static final String LIQUIBASE_CHANGELOG_FILE = "liquibase/liquibase-changelog-test.xml";
    private static final String UNIT_NAME = "com.ihsinformatics.tbreach.api.test";
    // Get entity manager
    EntityManager entityManager = Persistence.createEntityManagerFactory(
            UNIT_NAME).createEntityManager();

    @Before
    public void setupDatabase() throws Exception {
        Connection connection = ((SessionFactoryImpl) entityManager.unwrap(
                Session.class).getSessionFactory()).getConnectionProvider()
                .getConnection();
        Database database = DatabaseFactory.getInstance()
                .findCorrectDatabaseImplementation(
                        new JdbcConnection(connection));
        // Get liquibase instance / execute update / drop
        URL file = ClassLoaderUtil.getResource(LIQUIBASE_CHANGELOG_FILE,
                LiquibaseTestDbUtil.class);
        DatabaseChangeLog dbChangeLog = new DatabaseChangeLog(file.getPath());
        Liquibase liquibase = new Liquibase(dbChangeLog,
                new ClassLoaderResourceAccessor(), database);
        liquibase.update(new Contexts("test"));
        // liquibase.dropAll();
    }

    @Test
    public void someTestCase() throws Exception {
    }
}

Изменить файл журнала:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <property name="schemaName" value="tbreach_api_test" dbms="mysql,oracle,postgresql" />

    <changeSet author="owais.hussain" context="test" id="20180216-1" runOnChange="true">
        <createTable tableName="data_log" schemaName="${schemaName}">
            <column autoIncrement="true" name="log_id" type="INT">
                <constraints primaryKey="true" />
            </column>
            <column name="log_type" type="CHAR(6)">
                <constraints nullable="false" />
            </column>
            <column name="entity_name" type="VARCHAR(45)">
                <constraints nullable="false" />
            </column>
            <column name="record" type="TEXT" />
            <column name="description" type="TEXT" />
            <column name="date_created" type="datetime(6)">
                <constraints nullable="false" />
            </column>
            <column name="created_by" type="INT" />
            <column name="created_at" type="INT" />
            <column name="uuid" type="CHAR(38)">
                <constraints nullable="false" unique="true" />
            </column>
        </createTable>
    </changeSet>

    <!-- Test Data -->
    <changeSet author="owais.hussain" id="2018-02-19" runOnChange="true">
        <sqlFile dbms="mysql" path="src/test/resources/test-data.sql" />
    </changeSet>

</databaseChangeLog>

Файл persistence.xml хранится в каталоге src/test/resources/META-INF/со следующими сведениями:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="com.ihsinformatics.tbreach.api.test" transaction-type="RESOURCE_LOCAL">
        <description>
            Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide
        </description>
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/tbreach_api_test" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password" value="mypassword" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
        </properties>

    </persistence-unit>

</persistence>

У меня есть следующие зависимости в моем pom.xml

  • junit 4.10
  • жибабаза-сердечник 3.5.4
  • mysql-connector-java 5.1.45
  • Другие зависимости, такие как log4j

Когда я выполняю LiquibaseTestDbUtil как Junit в Eclipse, я получаю следующий журнал:

log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
INFO 2/19/18 2:40 PM: liquibase: Successfully acquired change log lock
INFO 2/19/18 2:40 PM: liquibase: Reading from tbreach_api_test.DATABASECHANGELOG
INFO 2/19/18 2:40 PM: liquibase: Successfully released change log lock

Но моя база данных (tbreach_api_test) выглядит пустой, всего две таблицы ликбеза, в которой пустая база данных.

Я погрузился в режим Debug, чтобы увидеть, что объект changeLog в классе Liquibase инициализирован, но пуст.

Что мне не хватает?

  • Обратите внимание, что я прокомментировал метод liquidibase.dropAll(), поэтому изменения БД должны сохраняться (как я знаю).
  • 0
    В вашем втором наборе изменений отсутствует context = "test". Что произойдет, если вы пропустите ограничение контекста в коде, например liquibase.update (null) ;?
  • 0
    И я думаю, что вы должны попытаться удалить атрибут "runOnChange = true".
Показать ещё 3 комментария
Теги:
junit
liquibase
changeset

1 ответ

1
Лучший ответ

Попробуйте использовать альтернативный конструктор Liquibase

Liquibase liquibase = new Liquibase(
    "your file path", 
    new FileSystemResourceAccessor(), 
    database
);
  • 0
    Огромное спасибо. Этот работал. Вероятно, ошибка в конструкторе Liquibase.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню