現在、テーブルを切り捨てることにより、特定の時点で既存のデータをパージすることを計画しています。これでよろしいですか?
第 2 レベルのキャッシュを使用しておらず、テーブルからエンティティを読み込んでいない場合は、セッションで切り詰める必要があります (整合性の制約に違反しないと仮定して)。
Session s = sf.openSession();
PreparedStatement ps = s.connection().prepareStatement("TRUNCATE TABLE XXX");
ps.executeUpdate();
その後、同じトランザクションまたは別のトランザクションでエンティティを永続化できるはずです。
もちろん、そのような TRUNCATE は Hibernateイベントを生成したり、 callbackをトリガーしたりすることはありません。
(...) 挿入時に、Hibernate の@GeneratedValue
(...)を使用して主キーを生成します
(すなわち) のデフォルトstrategy
を使用している場合は、デフォルトで Oracle のシーケンスに設定する必要があり、テーブルを切り捨てたりレコードを削除したりしても、シーケンスはリセットされません。@GeneratedValue
AUTO
jdbcTemplate.execute("TRUNCATE TABLE abc") のようにテーブルを切り捨てます
これは同等である必要があります (Hibernate と同じ基本的な JDBC 接続を使用することになります)。
Hibernate は挿入にどのシーケンスを使用しますか?
"hibernate_sequence"
私の知る限り、独自のシーケンスを宣言しない場合、Hibernate はデフォルトのシーケンスを生成します。
テーブルで max(field) + 1 を実行しているだけだと思いましたか?
私はそうは思いません.Hibernateが1からやり直さないという事実は、TRUNCATE
そうではないことを確認しているようです. SQL ロギングをアクティブにして、INSERT でデータベースに対して実行された正確なステートメントを確認することをお勧めします。
指定するジェネレーター@GeneratedValue
は単なる「ダミー」ジェネレーターです (作成したシーケンスには対応しません)。
100% 確信はありませんが、@SequenceGenerator
(または@TableGenerator
) を宣言しなかった場合、ジェネレーターを指定しても何かが変わるとは思いません。