2010-05-25 24 views
0

可以在使用Hibernate插入數據的同時截斷表嗎?好的時候也使用Hibernate截斷數據庫表?

我們用一個很大的關係將一個大的XML文件解析到Hibernate POJO中,並保存到數據庫中。

我們現在計劃通過截斷表格來清除某些時間點的現有數據。這個可以嗎?

好像工作正常。我們不使用Hibernate的二級緩存。有一點我注意到了,這很好,當插入時我們使用Hibernate的@GeneratedValue生成主鍵,其中Hibernate只使用比表中最高值大1的鍵值 - 即使我們正在截斷表格,Hibernate也會記住之前的值,並使用之前的值+ 1而不是從1開始。這很好,只是出乎意料。

請注意,我們做的截斷的原因,而不是在Hibernate POJO上調用delete()的速度。我們擁有數行數據,截斷速度更快。

回答

0

取決於您的應用程序。如果刪除數據庫中的行是okey,那麼truncate也是okey。

只要您的實體上沒有任何Pre-或PostRemove偵聽器,應該沒有問題。

另一方面......是否有可能在截斷時間在EntityManager中加載實體,或者這是一個只寫表(如日誌表)。在這種情況下,你根本沒有任何問題。

1

我們現在計劃通過截斷表來清除某些時間點的現有數據。這個可以嗎?

如果您沒有使用二級緩存,並且您未在表中加載要在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),我不認爲指定發電機改變一些東西。

+0

我們像jdbcTemplate.execute(「TRUNCATE TABLE abc」)一樣截斷表格。 Hibernate將使用什麼序列來插入?我認爲這只是在桌上做最大(場)+ 1?我們爲'@ GeneratedValue'指定的'generator'只是一個「虛擬」生成器(不對應於我們創建的任何序列)。 – 2010-05-25 19:06:05

+0

@Marcus:我在回答中已經介紹了這些觀點。 – 2010-05-25 19:34:32

相關問題