Hibernate、@ SequenceGenerator、allocationSize
使用時の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 …