После сохранения Hibernate JPA - запись отсутствует в базе данных - PullRequest
0 голосов
/ 30 мая 2019

При попытке написать тест BBD JBehave у меня возникла следующая проблема. Сценарий следующий: Из-за сообщения MQ некоторые конкретные записи должны быть сохранены в моей базе данных, а некоторые должны быть удалены из нее. На моем шаге @When я отправляю данное сообщение, а на моем шаге @Then у меня есть некоторые утверждения для контроля результата. Я сталкиваюсь с проблемой, связанной с методами сохранения и обновления Hibernate JPA, потому что это происходит сразу после того, как мой код запускается до моего шага @Then, и поэтому я всегда получаю ложный результат. Когда я проверяю его в режиме отладки и проверяю все записи, которые должны быть обновлены / обнаружены, они в порядке. Я предполагаю, что мои утверждения должны быть выполнены сразу после фиксации транзакции в базе данных - но это не так, как я вижу. Есть ли способ установить задержку или время ожидания между транзакциями базы данных?

Вот, например, мой метод удаления в моем основном проекте:

public void deleteByAbcId(final String Id) {
    getEm().createNamedQuery(TABLE.NAMED_QUERY_DELETE_BY_ABC_ID)
            .setParameter(Table.QUERY_PARAM_ABC_ID, Id)
            .executeUpdate();
}

И в моем проекте BDD я настроил соединение с базой данных следующим образом:

public class DatabaseService implements Closeable {

private EntityManagerFactory emf = null;
private EntityManager em = null;

/**
 * This creates an entity manager based on the db connection parameters received in the argument
 */
public DatabaseService(Properties configuration) {
    emf = Persistence.createEntityManagerFactory("project-pu", configuration);
    em = emf.createEntityManager();
    em.getTransaction().begin();
}

/**
 * Returns the entity manager for the db connection
 */
public EntityManager getEm() {
    return em;
}

В своем утверждении я использую следующий запрос, чтобы проверить, была ли данная запись успешно удалена из БД:

assertNull(dbHelper.findTableIdBasedOnAbcId(Serenity.sessionVariableCalled(ABC_ID)));

Мой класс dbHelper выглядит следующим образом:

public class DbHelper {

private DatabaseService database;
private Configuration config = Configuration.getInstance();

public DbHelper() {
    database = new DatabaseService(config.getDbProperties());
}

public String findTableIdBasedOnAbcId(String Id) throws Exception {

    String query = "SELECT id FROM TABLE WHERE ABC_ID = ?1";
    Query queryResult = database.getEm().createNativeQuery(query);
    queryResult.setParameter(1, Id);

    List<Long> list = (List<Long>) queryResult.getResultList();

    if (!list.isEmpty()) {
        return String.valueOf(list.get(0));
    }
    return null;
}

Он всегда повторяет заданную запись базы данных, которая не удаляется.

Это XML-файл моего основного проекта:

<persistence-unit name="aaa-pu" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>jdbc/aaaa-ds</jta-data-source>
    <mapping-file>META-INF/orm.xml</mapping-file>

    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>
        <property name="hibernate.transaction.jta.platform" value="org.hibernate.engine.transaction.jta.platform.internal.WeblogicJtaPlatform"/>
        <property name="hibernate.hbm2ddl.auto" value="none"/>
        <property name="hibernate.id.new_generator_mappings" value="false"/>
        <property name="tomee.jpa.factory.lazy" value="true"/>
    </properties>

</persistence-unit>

А это один из моих проектов BDD:

<persistence-unit name="project-pu" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
        <property name="hibernate.connection.autocommit" value="false" />
        <property name="hibernate.hbm2ddl.auto" value="none" />
        <property name="hibernate.show_sql" value="false" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.generate_statistics" value="false"/>
    </properties>
</persistence-unit>

Есть идеи, как установить транзакции, чтобы не выполнять метод assert до запуска executeUpdate в Hibernate? Я пытался вызвать метод entityManager.getTransaction.commit, а затем каждый раз запускать новый, но без изменений. Есть ли способ заблокировать транзакцию до тех пор, пока не будет выполнено executeUpdate и сразу после этого разрешить запрос на выборку? Или возможно с JBehave дать время ожидания или сна между шагами?

Спасибо.

...