繁体   English   中英

使用MySQL进行DataJpaTest存储库测试时,Hibernate不会将用户设置为在H2 DB中自动递增

[英]With DataJpaTest Repository Tests using MySQL, Hibernate doesn't set User to auto-increment in H2 DB

我正在尝试使用DataJpaTest测试我的Spring Boot存储库。 我正在使用MySQL,所以我的所有模型都使用IDENTITY来生成id:

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

但正如您从下面的屏幕截图中看到的,当我运行我的测试时,Hibernate为我的所有模型的ID设置“默认生成为身份”,除了用户和属性:

表生成的屏幕截图

这使我无法在我的测试中创建用户(或属性),因为GenerationType.IDENTITY设置总是在将id发送到db之前将其设置为null,这会导致以下错误:

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

有谁知道为什么会这样? 而且,当然,比我为什么要做的更重要的是解决它? :)

更新为了简化问题并为我试过的不同事情提供不同的错误......

我的DataJpaTests正在使用H2,我想这是从代码中自动生成db结构。 我真正的数据库是MYSQL,它是在一个单独的项目中生成的。

场景1:当我将GenerationType设置为IDENTITY时,实时数据库工作,但测试数据库给我could not execute statement; SQL [n/a]; constraint [null] could not execute statement; SQL [n/a]; constraint [null] could not execute statement; SQL [n/a]; constraint [null]

场景2:当我将GenerationType设置为AUTO时,测试数据库可以工作,但是实时数据库给我Table 'tablename.hibernate_sequence' doesn't exist

场景3:尝试使用GenerationType AUTO使MYSQL工作。 我没有发现很多关于如何告诉Hibernate默认MYSQL来识别而不是表格的东西。 我发现很多人说永远不会使用表,如果不改变Hibernate源代码就不可能覆盖这一点。 这是一堆BS,让我想知道Hibernate开发人员在吸烟。

场景4:尝试使用GenerationType IDENTITY使H2工作。 我在这里有一些运气与以下内容:

  1. 在test.properties文件中放置spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=MYSQL
  2. 使用@TestPropertySource(locations= "classpath:test.properties")@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)注释我的Test类

这摆脱了空约束错误,但我现在得到The database returned no natively generated identity value 据推测,这是因为,虽然实际的SQL代码具有id的auto_increment,但是用于为H2生成表的任何魔法都没有得到它。

附录:对所有这些都非常令人沮丧的是它对大多数表格都完全正常。 在我的数据库中的20多个表中,除了两个表之外的所有表都使用IDENTITY自动生成并递增它们的ID。 完全没有意义,其中一些会起作用,而其中一些则不起作用。

问题是另一个使用@Table(name = "user")作为注释的模型。 该模型还定义了Id列,但没有生成值。 由于冲突,Hibernate选择了一个来定义id。

MySql更好用

@GeneratedValue(strategy = GenerationType.AUTO) 

它也更好,因为它在大多数RDBMS中产生自动增量主键

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM