当前位置: 首页 > 知识库问答 >
问题:

SequenceGenerator在JUnit测试中不工作?

单琛
2023-03-14

我试图用内存中的H2 DB测试某些实体的持久性,但我认识到无论是在构建平台上运行还是在运行RunAs时,@SequenceGenerator都不会按应有的方式被调用-

我可以肯定的是,序列是在H2 DB内部生成的。当我连接到这个生成的H2时,我甚至可以选择它们。所以这绝对不是H2内部的问题,而是Hibernate的问题。(通常Hibernate会在持久化需要ID的实体时自动分配ID)。

实体

@Entity
@Table(name = "HOUSE_USERDATA")
public class UserData {

@Id
@Column(name = "HU_ID")
@GeneratedValue(generator = "SEQ_HOUSE_USERDATA", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(sequenceName = "SEQ_HOUSE_USERDATA", name = "SEQ_HOUSE_USERDATA", allocationSize = 2)
private Long huId;

@Column(name = "HU_DATA")
@Size(max = 1000)
private String m_data;

@ManyToOne
@JoinColumn(name = "HR_ID")
private Registry m_registry;

//more code [...]
}

引用实体中的引用。。。

  @OneToMany(mappedBy = "registry")
  private List<UserData> userDataList;

持久性单位...

<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.foo.bar.all.entity</class>
    <!-- all entity references -->
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.archive.autodetection" value="class"/>
        <property name="hibernate.connection.username" value="sa"/>
        <property name="hibernate.connection.password" value=""/>
        <property name="hibernate.connection.driver_class" value="org.h2.Driver"/>
        <property name="hibernate.connection.url" 
        value="jdbc:h2:inmemory;INIT=runscript from 'classpath:testscripts/drop_h2.sql'\;runscript from 'classpath:testscripts/create.sql'"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.use_sql_comments" value="true" />
    </properties>
</persistence-unit>

JUnit测试中的调用。。。

Registry registry = new Registry();
registry.setClientId("clientId");
List<UserData> userDataList = new ArrayList<>();
UserData userData1 = new UserData();
userData1.setData("User defined data 1.");
userData1.setRegistry(registry);
UserData userData2 = new UserData();
userData2.setData("User defined data 2.");
userData2.setRegistry(registry);
userDataList.add(userData1);
userDataList.add(userData2);
registry.setUserDataList(userDataList);


entityManager.persist(registry);


Registry result = entityManager.find(Registry.class, "clientId");
//MUST NOT BE NULL, BUT IS NULL
assertThat(result.getUserDataList().get(0).getId(), is(not(nullValue())))

其他值被正确地保留。只有ID没有生成。(我想知道为什么这个测试对所有其他值都有效,因为在生成的数据库中ID被定义为NOTNULL,所以应该有一个持久性异常或其他东西)。为什么序列生成器不生成任何东西(我尝试了GenerationType.AUTO也是,但没有区别)?

共有1个答案

陆才俊
2023-03-14

当您执行entityManager.persist(注册表)时,这就是它要做的,存储注册表并检查该类的所有映射。它会遇到UserData对象的集合,但是因为没有与PERSIST匹配的级联属性,所以不会存储UserData对象。

它将只存储顶级注册表对象。如果您想将此添加cascade={CascadeType.ALL}或至少cascade={CascadeType.PERSIST}@OneToMany注释,告诉Hibernate它还需要检查集合中的新元素并将其持久化。

或者先存储用户数据元素,然后再存储注册表

 类似资料:
  • 我有一个带有Java配置类的Spring(4.2.5)项目。这些在正常运行项目时起作用,但我无法使我的测试工作。在下面的测试中,为空。 如果添加注释,则会出现异常 其中和在和中定义,后者是基于活动配置文件选择的。 [编辑2] 经过更多的搜索,我发现了这个问题,并且在检查了我的依赖项之后,我发现我在maven依赖项下有Spring-Core-4.1.9,而且我没有在我的POM中包含一个依赖项。添加依

  • 我正在使用Eclipse中的 JUnit5位于modul-path上,并且在module-info.Java中是必需的。 当我尝试运行代码时,总是会收到以下消息: 初始化引导层java.lang.module.findException时出错:无法为C:\users\tim hp.p2\pool\plugins\org.junit.jupiter.migrationsupport_5.0.0.v2

  • 我使用ByteBuddy创建了一个java代理用于方法日志记录。 具有用。但是,在这些方法中,我引用了一个公共静态类及其所有属性和方法公共静态。在运行应用程序时,我能够使用这种方法记录所有方法,没有问题。 但是,当我运行一个用注释的测试类时,出现了一个问题。出于某种原因,插入指令的代码似乎消失了。还有其他人经历过类似的问题吗? 作为参考,当在IntelliJ中运行测试类时,我做了一个,并且在测试类

  • db-config-test.xml Maven插件: StackError:

  • 所以我是JUnit的新手,我们必须用它来做家庭作业。我们的教授给了我们一个有一个测试类的项目。当我右键单击>Run as>JUnit Test,我会弹出一个错误,上面写着‘找不到JUnit tests’。我知道这里已经回答了这个问题(没有找到测试运行程序'JUnit4'的测试),但是关闭eclipse、重新启动、清理和构建似乎不起作用。下面是我的运行配置、构建路径和我试图测试的类的截图。

  • 我在同一个测试类中有两个JUnit测试,每个都标记为@Transactional,第一个创建用户,第二个创建用户,并检查我们是否可以获得这些用户。 问题是,当第二个测试运行时,第一个测试创建的用户仍然在数据库中。 谢谢你抽出时间。