6

Hibernate と MySQL を使用するプロジェクトに取り組んでいます。シーケンスを使用して、データベース内のすべてのテーブルの ID を生成するつもりです。(私の質問を説明するのは難しいので、例として示します)。

例: 2 つのテーブル A と B があります。まず、テーブル A に 10 個のレコードを挿入すると、それらの ID は 1 から 10 になります。次に、テーブル B に 10 個のレコードを挿入します。IDを 1-10 ではなく11-20にします。これは、生成された ID 値が、単一のテーブルではなく、データベース内のすべてのテーブルのすべてのレコードによってカウントされることを意味します。

では、MySQL でその概念をどのように使用できますか? 宣言と構文?Hibernate では、データ モデルで戦略とジェネレータを使用して、生成された戦略をデータベースに適用するにはどうすればよいですか? どうもありがとう!

4

1 に答える 1

6

Mysql にシーケンスはありませんが、「TABLE」ID 生成を使用できます

@javax.persistence.TableGenerator(
    name="EMP_GEN",
    table="GENERATOR_TABLE",
    pkColumnName = "key",
    valueColumnName = "hi"
    pkColumnValue="EMP",
    allocationSize=20
)

@Entity
public class Klass {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator=EMP_GEN)
    @Column(name = "ID")
    private Long id;
}

@javax.persistence.TableGenerator [...]すべてのエンティティにスニペットを追加する必要がある場合があります

編集

どうもありがとう。しかし、各エンティティに追加せずにそのスニペットを使用する別の方法はありますか? また、データベースにテーブルを作成するときに、DBMS の ID 主キー列を宣言して、そのような値を自動生成するにはどうすればよいですか? –ナポレオン76

残念ながら、これを行うエレガントな方法はわかりません:(。私のプロジェクトでは、いくつかのエンティティで a シーケンスを使用しており、各クラスでシーケンスを宣言する必要があります。試すことができることの1つ(ただし、私はしません. t 本当に好き) は、すべてのエンティティに対してスーパー クラスを作成することであり、そのスーパークラスには ID フィールドと注釈のみが含まれています. プロジェクトでこれを見たような気がしますが、100% 確実ではありません.

DBにその戦略を使用するように指示することについて、私はそれが本当に可能だとは思わない. トリガーを追加して、スキーマ内の各テーブルに適用することができます。テーブルに新しい行を挿入し、ジェネレーター テーブルから値を選択して行に追加すると、トリガーが起動します。正直なところ、これが機能するかどうかはわかりません.2つの同時セッションで行を作成している場合、これが機能しないことは 99% 確信しています。

戦略を再考して、ID に通常の自動インクリメント列を使用し、連続番号をテーブルの別の列に入れることはできますか?

于 2011-02-16T11:25:01.143 に答える