[英]Hibernate doesn't auto increment id of entity { Country } ( using h2 data base )
[英]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工作。 我在這里有一些運氣與以下內容:
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=MYSQL
。 @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.