【问题标题】:Can't find entities in PersistenceContext after .persist().persist() 之后在 PersistenceContext 中找不到实体
【发布时间】:2011-08-19 19:01:52
【问题描述】:

我正在编写一个 JavaEE 项目,并且正在尝试进行一些单元测试。我们使用的单元测试框架是 JUnit,以及用于构建和 CI 的 Maven 和 Hudson。

在其他测试中,我想测试 JPA-2.0 查询逻辑,因为这是我们项目的核心功能之一。我们实现了相当复杂的查询逻辑,它还允许用户犯错、拼写错误等,因此我们希望确保它能够正常工作。

查询本身是使用 JPA-2.0 Criteria API 和 Metamodel API 动态构建的。

现在,在我的单元测试中,我设置了持久性并像这样创建了一个 EntityManager:

protected static EntityManagerFactory emf;
protected static EntityManager em;
emf = Persistence.createEntityManagerFactory("persistenceUnitName");
em = emf.createEntityManager();

这行得通,我也可以查询数据库——但这不是我想要的。

我想要做什么:
由于我们不希望数据库中的测试数据,计划是首先创建一些实体,然后持久化它们。然后我们会运行我们的查询并确保我们得到正确的结果。最后,由于单元测试持久性不在事务中运行,实体永远不会持久化到 DB,并且 DB 保持不变(这是我们想要的)。

Entity entity = new Entity();
entity.setAttribute("stuff");
//...
em.persist(entity);
// ...
// Here comes the query which should find above entity with attribute 'stuff'...

但是。无论我在单元测试中创建和坚持的任何实体,都无法在同一个测试(甚至方法)中找到。我可以成功查询数据库并从那里找到实体,但是新持久化的测试用例不存在。

我想我误解了关于 JPA 持久性上下文的一些关键问题 - 如果有人能启发我,我会很高兴! :)

在重要的情况下,测试使用的 persistence.xml 如下所示:

<persistence-unit name="persistenceUnitName" transaction-type="RESOURCE_LOCAL">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <!-- list of classes to manage -->
  <properties>
    <!-- driver and connection info, this works-->
  </properties>
</persistence-unit>

【问题讨论】:

    标签: jakarta-ee junit persistence ejb jpa-2.0


    【解决方案1】:

    你有 EntityManager.getTransaction().begin() 来启动事务a,然后 rollback() 来回滚它。或者,也许您可​​以创建整个数据库的单独复制实例,仅用于测试?只是一个想法。

    【讨论】:

    • 这似乎很有希望,谢谢。关于测试数据库:这并不能真正解决问题,因为我不希望单元测试依赖于一些可能会经常更改的测试数据库条目......因此我们想首先创建假条目(使用真实的-生活示例(如果可能)并测试这些...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2015-06-12
    相关资源
    最近更新 更多