為什麼將 @GenerateValue(strategy = GenerationType.TABLE) 與抽象超類別一起使用會導致使用 Hibernate 和 MySQL 的 Spring 應用程式出現問題?

Barbara Streisand
發布: 2024-11-10 16:43:02
原創
387 人瀏覽過

Why does using @GeneratedValue(strategy = GenerationType.TABLE) with an abstract superclass cause issues in a Spring application with Hibernate and MySQL?

抽象超類別和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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板