使用時の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>
save
がシーケンスの次の値についてデータベースをクエリする必要があるためです。
SequenceGenerator
IDの量がで指定されたときに休止状態にのみデータベースを照会しますallocationsize
無くなっ。セットアップした場合allocationSize = 1
、それがHibernateが各挿入についてDBにクエリする理由です。この値を変更すれば完了です。
hibernate.id.new_generator_mappings
設定はとても重要です。ID番号がワイルドになる理由を調査するのにそれほど時間をかける必要がないのが、デフォルトの設定であることを願っています。