[解決済み] Hibernate、@SequenceGeneratorとallocationSize
質問
私たちは、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 をサポートするわけではありません)。 とにかく、様々なオプティマイザ戦略について、そこで読んでみてください。
関連
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
Dateが型に解決できない問題を解決する
-
javaでよく使われる英単語
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
ローカルリソースのロードが許可されていない場合の解決策
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] Hibernate JPA シーケンス(非Id)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラー java.util.NoSuchElementException
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
jd-gui Java Exceptionが発生しました。
-
final, finally, finalizeの違いについて話してください。
-
Javaクラスローダーにソースコードから潜り込む
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
サーブレットクラスのインスタンス化エラーの解決法
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール