JPA 2.1测试:持久保存预加载的数据

时间:2017-11-07 13:10:05

标签: hibernate jpa eclipselink jboss-arquillian persistence.xml

我正在使用Arquillian对“远程”容器(Glassfish 4和WildFly 10,具体而言)测试我的JPA类。我想:

  • 从JPA实体的定义(而不是SQL脚本)生成数据库模式。
  • 预加载一些数据以模仿“已存在的数据”。对于一个最简单的例子,测试我是否可以删除一个实体,而不是先在同一个测试中创建它。
  • 能够执行查询,插入,更新,删除等。

有javax.persistence。*属性似乎符合要求,因此可以假设,以下内容将起作用:

<persistence-unit name="test">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/H2DS</jta-data-source>
        <properties>

      <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>

      <property name="javax.persistence.schema-generation.create-source" value="metadata"/>


      <property name="javax.persistence.sql-load-script-source" value="META-INF/sql/load_script.sql"/>

      <property name="javax.persistence.schema-generation.drop-source" value="script"/>
      <property name="javax.persistence.schema-generation.drop-script-source" value="META-INF/sql/drop.sql" />          

</properties>

嗯,不太好。

如果使用GenerationType.TABLE,则必须更新主键序列的值以及使用SQL脚本插入新实体。问题是虽然使用脚本插入了一些实体(当然也更新了“generator-table”中的主键值),但JPA提供程序不会以任何方式更新其预分配的ID。所以,我可以从日志中判断出来的是:

  • 创建“generator-table”
  • 主键1-5已预先分配(但DB表中的值未更新
  • 插入了三个来自脚本的条目(但是,这还没有提交)
  • 准备了“generator-table”的选择和更新语句(但尚未执行)
  • 准备了来自测试的实体实例的插入语句,并分配了错误的主键。在Hibernate的情况下,“Wrong”为-1,在EclipseLink的情况下为1。当然,后者因重复录入而引发异常。

到目前为止找到的解决方案

EclipseLink :如果数据库架构和数据预加载都是通过脚本完成的,则可以正常工作。对于开发阶段来说是次优的,因为人们不得不经常使用SQL脚本。

Hibernate :如果设置了以下特定于实现的选项,则有效:

<property name="hibernate.id.new_generator_mappings" value="false"/>

允许实体持久测试,主键是分配大小的3倍(15,有3个实体)。

现在,问题是:是否存在一些“标准JPA”,与实现无关的方式来实现我在本问题开头列出的要求?它们看起来并不奢侈,所以应该有现成的解决方案,对吧?

0 个答案:

没有答案