Прежде чем я объясню свою проблему, я должен заявить, что я новичок в 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
Когда я выполняю 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 инициализирован, но пуст.
Что мне не хватает?
Попробуйте использовать альтернативный конструктор Liquibase
Liquibase liquibase = new Liquibase(
"your file path",
new FileSystemResourceAccessor(),
database
);