在.persist()之后找不到PersistenceContext中的实体

时间:2011-08-19 09:01:34

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

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

在其他测试中,我想测试 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>

1 个答案:

答案 0 :(得分:1)

你有EntityManager.getTransaction()。begin()来启动transactiona然后rollback()来回滚它。或者您可以创建一个单独的复制的整个数据库实例来进行测试?只是一个想法。