2012-08-17 76 views
5

我的任務是重新啓動PostgreSQL數據庫中許多不同的串行列的序列。通常,我會簡單地使用:如何重新啓動由Hibernate處理的PostgreSQL序列?

ALTER SEQUENCE serial RESTART WITH 105; 

但是,似乎Hibernate正在用於處理數據庫序列。我對Hibernate一無所知,但我的理解是,hibernate_sequence是所有表的全局序列。那是對的嗎?

我假設我需要做以下內容,然後:

ALTER SEQUENCE hibernate_sequence RESTART WITH 105; 

但我不知道後果會是什麼。假設我有表A,B,C和D.這些表中的每一個都有一個類型爲serial的ID列。上述hibernate_sequence上的SQL語句是否會重新啓動所有表的ID列?

謝謝!

回答

4

首先,這裏有一個潛在的問題:你正在處理序列的價值,就像它們意味着什麼。看到答案的結尾。

現在,使用Hibernate,它取決於用戶如何配置映射。一個配置良好的Hibernate實例將使用與其他一切相同的序列。

不幸的是,大多數映射不是很好 - 或者說,我認爲Hibernate的默認行爲是可怕的,應該總是被覆蓋。所有表使用的默認序列確實是共享的hibernate_sequence。但是,完全有可能使用它們自己的序列和其他使用共享的hibernate_sequence的表,或者使所有表正確使用它們自己的序列。

要啓用明確的答案,您需要發佈映射。

如果要更改ID生成的表在其Hibernate映射中使用的表的正確順序,則可以繼續並按ALTER SEQUENCE該順序。如果您的映射是通過JPA完成的,則使用@SequenceGenerator@GeneratedValueGenerationType.SEQUENCE完成。如果通過orm.xml,hbm.xml或舊式Hibernate註釋完成,則需要檢查手冊。或者,如果Hibernate是寫入數據庫的唯一客戶端,請查看序列以查看它們是否正在使用SELECT * FROM sequence_name

如果感興趣的表的映射使用共享的hibernate_sequence,那麼如果不修復Hibernate映射,您可能無法做到自己想做的事。您需要更改映射,以便感興趣的表的映射使用不同的序列,然後`LOCK TABLE並將這些序列的起始點設置爲當前表中最大的行。

序列號:爲什麼需要來更改或重新啓動序列?這並不重要,因爲合成主鍵只是一個無意義的數字,您可以將它與其他無意義的數字進行比較。你想解決什麼問題?

+0

映射是用JPA完成的,例如,所有類(映射到數據庫的表格)都有一個「Integer id = -1」,映射定義爲「@GeneratedValue(strategy = GenerationType 。序列)」。由於數據庫中只有一個序列(hibernate_sequence),並且由於所有不同表中的ID值之間存在差距,所以我認爲可以安全地假設默認序列是在所有共享序列之間共享的,如前所述。由於避免了數據庫傳輸中的一些衝突,因此需要爲所有這些表重新啓動序列。 – littleK 2012-08-17 15:02:47

+0

再次感謝您的幫助,非常翔實。 – littleK 2012-08-17 15:03:34

+1

@littleK沒問題。希望它有一點幫助。合併數據庫......嗯......「有趣」。特別有趣。希望你買了很多很多的杜松子酒。 – 2012-08-17 15:15:09

相關問題