我們現在計劃通過截斷表來清除某些時間點的現有數據。這個可以嗎?
如果您沒有使用二級緩存,並且您未在表中加載要在Session中截斷的實體,則以下方法應該可行(假設它不會破壞完整性約束):
Session s = sf.openSession();
PreparedStatement ps = s.connection().prepareStatement("TRUNCATE TABLE XXX");
ps.executeUpdate();
而且您應該能夠在此之後堅持實體,無論是在同一事務中還是在另一個事務中。
當然,如果這很重要的話,這樣的TRUNCATE不會產生任何Hibernate event或觸發任何callback。
(...)插入時,我們使用生成主鍵Hibernate的@GeneratedValue
(...)
如果您使用的是默認strategy
爲@GeneratedValue
(即AUTO
),那麼它應該默認爲如果您截斷表或刪除記錄,則不會重置帶有Oracle和序列的序列。
我們截斷喜歡的JdbcTemplate表。執行(「TRUNCATE TABLE abc」)
這應該是等效的(您將最終使用與Hibernate相同的底層JDBC連接)。
Hibernate將使用什麼序列來插入?
AFAIK,Hibernate爲您生成一個默認的"hibernate_sequence"
序列,如果你沒有聲明你自己的。
我以爲這只是在桌子上做一個max(field)+ 1?
我不這麼認爲,事實上,Hibernate並不在TRUNCATE
似乎也印證了這並不之後,從1開始。我建議激活SQL日誌記錄以查看在INSERT上針對您的數據庫執行的確切語句。
我們爲@GeneratedValue
指定的生成器只是一個「虛擬」生成器(不對應於我們創建的任何序列)。
我不是100%肯定,但如果你不聲明任何@SequenceGenerator
(或@TableGenerator
),我不認爲指定發電機改變一些東西。
我們像jdbcTemplate.execute(「TRUNCATE TABLE abc」)一樣截斷表格。 Hibernate將使用什麼序列來插入?我認爲這只是在桌上做最大(場)+ 1?我們爲'@ GeneratedValue'指定的'generator'只是一個「虛擬」生成器(不對應於我們創建的任何序列)。 – 2010-05-25 19:06:05
@Marcus:我在回答中已經介紹了這些觀點。 – 2010-05-25 19:34:32