簡體   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