@GeneratedValue(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?

@GeneratedValue 抽象スーパークラスと MySQL の落とし穴

Hibernate と MySQL を使用して Spring アプリケーションの ID 値を管理しようとすると、抽象スーパークラス BaseEntity は課題を引き起こす可能性があります。 @GeneratedValue(strategy = GenerationType.TABLE) を使用すると、Hibernate が ID を段階的に生成するために必要な hibernate_sequences テーブルが存在しないため、エラーが発生します。

根本的な問題

MySQL はシーケンスをネイティブにサポートしていないため、GenerationType.TABLE アプローチには障害が生じます。この戦略では通常、専用のテーブルを利用してシーケンス値を追跡し、一意の ID を割り当てます。 MySQL にはこの機能がないため、「テーブル 'docbd.hibernate_sequences' が存在しません」エラーが発生します。

問題の解決

この問題を解決するには、オブジェクトを正常に永続化するには、次の回避策が必要です。

1. GenerationType.IDENTITY

を使用する この戦略は、データベース独自の自動インクリメント メカニズムに依存しているため、専用のシーケンス テーブルが不要になります。ただし、抽象スーパークラスを使用して派生クラス全体の ID を管理するという目的とは互換性がありません。

2. Hibernate シーケンス テーブルを作成する

MySQL にはネイティブ シーケンス サポートがないにもかかわらず、シーケンス動作をエミュレートするカスタム テーブルを作成できます。 hibernate_sequences という名前のテーブルを作成する例を次に示します。

3.カスタム シーケンスを使用するように Hibernate を構成する

BaseEntity クラスで、カスタム シーケンス テーブルを利用するように @GeneratedValue アノテーションを調整します。

4.エンティティ テーブルの列定義を調整

CCD テーブルで、ID 列定義がカスタム シーケンスに対応していることを確認します:

フォールバック メソッド

他の予期せぬ問題によりカスタム シーケンスのアプローチが失敗した場合は、最後の手段として、手動 ID 生成メカニズムの実装を検討してください。 BaseEntity クラス内:

結論

Hibernate と MySQL を使用した Spring アプリケーションで ID 管理に抽象スーパークラスを使用するには、基礎となるデータベースの制限について慎重に考慮する必要があります。 。カスタム シーケンス テーブルを作成するという回避策を採用すると、MySQL にネイティブ シーケンス サポートがないことに起因する問題を軽減できます。ただし、これらのアプローチはパフォーマンスに影響を及ぼしたり、システム設計にさらなる複雑さをもたらす可能性があります。

以上が@GeneratedValue(strategy = GenerationType.TABLE) を抽象スーパークラスで使用すると、Hibernate と MySQL を使用する Spring アプリケーションで問題が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート