使用時の Hibernate のデフォルトの動作は周知のとおりです。@SequenceGenerator
実際のデータベース シーケンスを1増やし、この値を 50 倍して (デフォルトallocationSize
値)、この値をエンティティ ID として使用します。
これは正しくない動作であり、次の仕様と矛盾します。
allocationSize - (オプション) シーケンスからシーケンス番号を割り当てるときに増分する量。
明確にするために: 生成された ID 間のギャップについては気にしません。
基礎となるデータベース シーケンスと一致しないID が気になります。例: 他のアプリケーション (プレーンな JDBC を使用するアプリケーションなど) は、シーケンスから取得した ID の下に新しい行を挿入したい場合がありますが、それらの値はすべて Hibernate によって既に使用されている可能性があります! 狂気。
誰かがこの問題の解決策を知っていますか (設定せずにallocationSize=1
パフォーマンスを低下させません)?
編集:
物事を明確にするために。最後に挿入されたレコードに ID = があった場合1
、HB は51, 52, 53...
新しいエンティティの値を使用しますが、同時に、データベース内のシーケンスの値は に設定され2
ます。他のアプリケーションがそのシーケンスを使用している場合、これは簡単にエラーにつながる可能性があります。
一方:仕様では、(私の理解では)データベースシーケンスをに設定する必要が51
あり、その間、HBは範囲の値を使用する必要 があると述べています2, 3 ... 50
更新:
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;
}
persistence.xml
<persistence-unit name="testPU">
<properties>
<property name="hibernate.id.new_generator_mappings" value="true" />
</properties>
</persistence-unit>