1

Hibernate を使用してデータを挿入すると同時に、テーブルを切り捨てても問題ありませんか?

多くの関係を持つ大きな XML ファイルを Hibernate POJO に解析し、DB に永続化します。

現在、テーブルを切り捨てることにより、特定の時点で既存のデータをパージすることを計画しています。これでよろしいですか?

それうまくいくようです。Hibernate の二次キャッシュは使用しません。私が気づいたことの1つは、これは問題ありませんが、挿入時に@GeneratedValueHibernateを使用して主キーを生成することです.Hibernateはテーブルの最高値よりも1大きいキー値を使用します.テーブルを切り捨てていますが、Hibernateは前のvalue を使用し、1 からやり直すのではなく、以前の値 + 1 を使用します。これは問題ありませんが、予想外です。

delete()Hibernate POJOを呼び出すのではなく切り詰める理由は、速度のためであることに注意してください。膨大な数のデータ行があり、truncate は非常に高速です。

4

2 に答える 2

3

現在、テーブルを切り捨てることにより、特定の時点で既存のデータをパージすることを計画しています。これでよろしいですか?

第 2 レベルのキャッシュを使用しておらず、テーブルからエンティティを読み込んでいない場合は、セッションで切り詰める必要があります (整合性の制約に違反しないと仮定して)。

Session s = sf.openSession();
PreparedStatement ps = s.connection().prepareStatement("TRUNCATE TABLE XXX");
ps.executeUpdate();

その後、同じトランザクションまたは別のトランザクションでエンティティを永続化できるはずです。

もちろん、そのような TRUNCATE は Hibernateイベントを生成したり、 callbackをトリガーしたりすることはありません。

(...) 挿入時に、Hibernate の@GeneratedValue(...)を使用して主キーを生成します

(すなわち) のデフォルトstrategyを使用している場合は、デフォルトで Oracle のシーケンスに設定する必要があり、テーブルを切り捨てたりレコードを削除したりしても、シーケンスはリセットされません。@GeneratedValueAUTO


jdbcTemplate.execute("TRUNCATE TABLE abc") のようにテーブルを切り捨てます

これは同等である必要があります (Hibernate と同じ基本的な JDBC 接続を使用することになります)。

Hibernate は挿入にどのシーケンスを使用しますか?

"hibernate_sequence"私の知る限り、独自のシーケンスを宣言しない場合、Hibernate はデフォルトのシーケンスを生成します。

テーブルで max(field) + 1 を実行しているだけだと思いましたか?

はそうは思いません.Hibernateが1からやり直さないという事実は、TRUNCATEそうではないことを確認しているようです. SQL ロギングをアクティブにして、INSERT でデータベースに対して実行された正確なステートメントを確認することをお勧めします。

指定するジェネレーター@GeneratedValueは単なる「ダミー」ジェネレーターです (作成したシーケンスには対応しません)。

100% 確信はありませんが、@SequenceGenerator(または@TableGenerator) を宣言しなかった場合、ジェネレーターを指定しても何かが変わるとは思いません。

于 2010-05-25T18:59:57.107 に答える
0

アプリケーションによって異なります。データベース内の行を削除しても問題ない場合は、切り捨ても問題ありません。

エンティティに Pre- または PostRemove リスナーがない限り、問題はないはずです。

一方...切り捨て時にEntityManagerにロードされたエンティティがまだ存在する可能性がありますか、それともこれは書き込み専用テーブル(ロギングテーブルなど)ですか?この場合、まったく問題はありません。

于 2010-05-25T18:52:23.867 に答える