1. ホーム
  2. java

[解決済み] Hibernate、@SequenceGeneratorとallocationSize

2022-06-09 01:11:35

質問

私たちは、Hibernateのデフォルトの振る舞いを知っています。 @SequenceGenerator - を使用すると、実際のデータベース・シーケンスを 1 の場合、この値を50倍する(デフォルト allocationSize の値) - そして、この値をエンティティIDとして使用します。

これは不正確な動作であり 仕様と矛盾します。 という

allocationSize - (オプション) シーケンスからシーケンス番号を割り当てる際に増加させる量です。

はっきり言って、生成されたIDの間のギャップは気にしません。

私が気にするのは、IDが 一貫性がない である ID が気になります。例えば、他のアプリケーション(例えば、普通のJDBCを使用する)は、シーケンスから取得したIDの下に新しい行を挿入したいかもしれませんが、それらの値はすべてHibernateによってすでに使用されているかもしれません!このような場合、Hibernateは、そのようなIDの下に新しい行を挿入することができます。狂気です。

誰かこの問題に対する解決策をご存知ですか? allocationSize=1 を設定することなく、したがってパフォーマンスを低下させることなく)何か解決策を知っていますか?

EDITです。

物事を明確にするために。 最後に挿入されたレコードがID =を持っていた場合 1 である場合、HBは値を使用します。 51, 52, 53... を新しいエンティティの BUT に使用します。 2 . これは、他のアプリケーションがそのシーケンスを使用する際に、簡単にエラーを引き起こす可能性があります。

一方、仕様では(私の理解では)、データベースのシーケンスは 51 に設定されている必要があり、その間に HB は範囲 2, 3 ... 50



UPDATEです。

Steve Ebersole が後述するように、私が説明した動作(そして、多くの人にとって最も直感的な動作でもある)は hibernate.id.new_generator_mappings=true .

皆さん、ありがとうございます。

アップデイト2。

今後の読者のために、以下に動作例を示します。

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "USERS_SEQ")
    @SequenceGenerator(name = "USERS_SEQ", sequenceName = "SEQUENCE_USERS")
    private Long id;
}

永続性.xml

<persistence-unit name="testPU">
  <properties>
    <property name="hibernate.id.new_generator_mappings" value="true" />
  </properties>
</persistence-unit>

どのように解決するのですか?

はっきり言って...あなたが説明したことは ではなく 仕様と何ら矛盾するものではありません。 仕様では、Hibernate がエンティティに割り当てる値について述べており、データベース シーケンスに実際に格納される値については述べていません。

しかし、あなたが探している動作を得るためのオプションがあります。 まず JPAアノテーションとHibernateを使用して@GeneratedValueストラテジーを動的に選択する方法はありますか? それはあなたに基本を与えるでしょう。 あなたがそのSequenceStyleGeneratorを使用するように設定されている限り、Hibernateは次のように解釈します。 allocationSize をSequenceStyleGeneratorの中の"pooled optimizer"を使って解釈します。 pooled optimizer" は、シーケンスの作成時に "increment" オプションを許可するデータベースで使用するためのものです(シーケンスをサポートするすべてのデータベースが increment をサポートするわけではありません)。 とにかく、様々なオプティマイザ戦略について、そこで読んでみてください。