抽象超類別和MySQL 的@GeneeratedValue 陷阱
嘗試使用Hibernate 和MySQL 管理Spring 應用程式中的ID 值,使用抽象超ID 值類BaseEntity 可能會帶來挑戰。當使用 @GenerateValue(strategy = GenerationType.TABLE) 時,由於缺少 Hibernate 增量產生 ID 所需的 hibernate_sequences 表而出現錯誤。
潛在問題
MySQL 本身不支援序列,這給 GenerationType.TABLE 方法帶來了障礙。此策略通常利用專用表來追蹤序列值並分配唯一 ID。由於 MySQL 缺少此功能,因此會導致「表 'docbd.hibernate_sequences' 不存在」錯誤。
解決問題
要克服此問題,成功持久化對象,需要一個解決方法:
1。使用 GenerationType.IDENTITY
這個策略依賴資料庫本身的自增機制,這樣就不需要專門的序列表了。但是,它與使用抽象超類別來管理跨衍生類別的 ID 的意圖不相容。
2.建立 Hibernate 序列表
儘管 MySQL 缺乏本機序列支持,但它允許建立自訂表來模擬序列行為。以下是建立名為 hibernate_sequences 的表格的範例:
CREATE TABLE IF NOT EXISTS hibernate_sequences( sequence_name VARCHAR(255) NOT NULL, sequence_next_hi_value INT UNSIGNED NOT NULL AUTO_INCREMENT, PRIMARY KEY (sequence_name) ) ENGINE=InnoDB;
3。配置Hibernate 以使用自訂序列
在BaseEntity 類別中,調整@GenerateValue 註解以使用自訂序列表:
@GeneratedValue(strategy = GenerationType.TABLE, generator = "hilo_generator") private Integer id; @SequenceGenerator(name = "hilo_generator", sequenceName = "hibernate_sequences", allocationSize = 1)
4.調整實體表中的列定義
CCD表中,確保id列定義對應自訂序列:
CREATE TABLE IF NOT EXISTS ccd( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, #other stuff ) ENGINE=InnoDB;
後備方法
作為最後的手段,如果自訂序列方法因其他意外問題而失敗,請考慮在BaseEntity 類別:
private static int idSequence = 0; public Integer getId() { if (id == null) { return idSequence++; } return id; }
結論
在具有Hibernate 和MySQL 的Spring應用程式中使用抽象超類別進行ID 管理需要仔細考慮底層資料庫的限制。採用建立自訂序列表的解決方法可以緩解因 MySQL 缺乏本機序列支援而導致的問題。然而,這些方法可能會產生效能影響或為系統設計帶來額外的複雜性。
以上是為什麼將 @GenerateValue(strategy = GenerationType.TABLE) 與抽象超類別一起使用會導致使用 Hibernate 和 MySQL 的 Spring 應用程式出現問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!