@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 サイトの他の関連記事を参照してください。