我正在構建一個計算貸款的 Web API。這筆貸款有一個付款清單:
@Entity
public class Loan {
@Id
@GeneratedValue
@Column(name = "id", nullable = false)
private Long id;
...
@OneToMany(cascade = CascadeType.ALL)
private List<Payment> amortizationSchedule;
}
@Entity
public class Payment {
@Id
@GeneratedValue
private Long id;
...
}
每當我存盤這些物體時,我都希望按如下方式生成主鍵:
- 貸款已創建,生成的 id = 1
- 貸款已創建,生成的 id = 2
- 付款已創建,生成的 id = 1
- 付款已創建,生成的 id = 2
相反,會發生以下情況:
- 貸款已創建,生成的 id = 1
- 貸款已創建,生成的 id = 2
- 付款已創建,生成的 id = 3
- 付款已創建,生成的 id = 4
為什么會這樣?以及如何讓 Java Persistence API 基于某個類的物體數量而不是物體總數來生成主鍵?
uj5u.com熱心網友回復:
嘗試為您的世代價值添加策略
@GeneratedValue(strategy = GenerationType.IDENTITY)
uj5u.com熱心網友回復:
@GeneratedValueHibernate 中的默認值是AUTO,但自 hibernate 5 以來, 的默認解釋AUTO已更改并使用序列生成器。這就是為什么你會看到不同表的連續數字,因為 ids 來自同一個來源,一個序列(如果你使用的是 MySQL,我懷疑你這樣做,它不支持 SEQUENCE,你會注意到 hibernate 有創建了一個表hibernate_sequence來模擬它)。
https://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#identifiers-generators-auto
這是自 Hibernate 5.0 以來的默認策略。[...] . 使用此策略時,AUTO 始終決議為 SequenceStyleGenerator。如果底層資料庫支持序列,則使用 SEQUENCE 生成器。否則,將使用 TABLE 生成器。
要解決這個問題,只需按照@CodeAddict 在他的回答中所說的去做,使用@GeneratedValue(strategy = GenerationType.IDENTITY)它就可以使用AUTO_INCREMENTMySQL的功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/361205.html
