Jakarta ee Can';在PersistenceContext.persist()之后找不到实体

Jakarta ee Can';在PersistenceContext.persist()之后找不到实体,jakarta-ee,junit,persistence,ejb,jpa-2.0,Jakarta Ee,Junit,Persistence,Ejb,Jpa 2.0,我正在写一个JavaEE项目,并且正在尝试进行一些单元测试。我们使用的单元测试框架是JUnit,与Maven和Hudson一起用于构建和CI 在其他测试中,我想测试JPA-2.0查询逻辑,因为这是我们项目的核心功能之一。我们实现了非常复杂的查询逻辑,允许用户出错、拼写错误等。因此,我们希望舒尔能够做到这一点 查询本身是使用JPA-2.0标准API和元模型API动态构造的 现在,在我的单元测试中,我设置了持久性并创建了一个EntityManager,如下所示: protected static E

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

在其他测试中,我想测试JPA-2.0查询逻辑,因为这是我们项目的核心功能之一。我们实现了非常复杂的查询逻辑,允许用户出错、拼写错误等。因此,我们希望舒尔能够做到这一点

查询本身是使用JPA-2.0标准API和元模型API动态构造的

现在,在我的单元测试中,我设置了持久性并创建了一个EntityManager,如下所示:

protected static EntityManagerFactory emf;
protected static EntityManager em;
emf = Persistence.createEntityManagerFactory("persistenceUnitName");
em = emf.createEntityManager();
这是可行的,我也可以查询数据库-但这不是我想要的

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

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

我想我误解了关于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>

org.hibernate.ejb.HibernatePersistence

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

这似乎很有希望,谢谢。关于测试数据库:这并不能真正解决问题,因为我不希望单元测试依赖于一些可能经常更改的测试数据库条目。。。因此,我们希望首先创建假条目(在可能的情况下使用现实生活中的示例)并测试这些。。。
<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>