首页 > 解决方案 > Hibernate JPA 持久化后 - 记录不在数据库中

问题描述

我在尝试编写一些 JBehave BDD 测试时遇到以下问题。场景如下:由于 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>

任何想法,如何设置事务在 Hibernate 的 executeUpdate 运行之前不执行 assert 方法?我尝试调用 entityManager.getTransaction.commit 方法,然后每次都启动一个新方法,但没有任何变化。有没有办法锁定事务,直到 executeUpdate 完成,然后才允许选择查询?或者 JBehave 是否可以在步骤之间提供等待或睡眠时间?

谢谢你。

标签: javahibernatejbehaveserenity-bddhibernate-jpa

解决方案


推荐阅读