2011-06-07 71 views
5

說我有一個自動生成的主鍵的實體。現在,如果我嘗試使用可能不是唯一的所有其他字段的值來保存該實體。 實體使用插入的行的id獲取自動填充。它是如何得到這個主鍵值的?hibernate如何填充自動生成的字段的ID?

編輯:

如果主鍵列說,其價值完全由數據庫決定標識列。所以它做了一個沒有列值的插入語句,數據庫決定使用它的值是否傳達回它的決定(我不這麼認爲)

回答

6

Hibernate使用三種方法來提取數據庫自動生成的字段,具體取決於jdbc驅動程序或您使用的方言的支持。

休眠提取物產生的場值,以將它放回在POJO:

  1. 使用方法的Statement.getGeneratedKeys(Statement的javadocs)

  2. 插入和選擇產生的場直接來自insert語句的值。 (Dialect的Javadoc)

  3. 執行SELECT語句插入後檢索生成的標識值

所有這一切都是由Hibernate內部完成。

希望它是你正在尋找的解釋。

+0

完美。正是我在尋找的感謝。但我真的沒有得到第三點。它如何通過select語句獲得身份值?鑑於行值不唯一,除了生成的值 – vinothkr 2011-06-22 06:04:33

+1

這是您使用的方言特有的函數。該選擇不基於域對象中字段的組合。使用Mysql,它使用「SELECT LAST_INSERT_ID()」(請參閱​​[鏈接](http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html) – 2011-06-22 13:24:48

1

This Hibernate文檔的一節介紹了自動生成ids。通常情況下,自動生成策略用於最大的可移植性,並假設你使用註解提供您的域的元數據,你可以按如下步驟進行設置:

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private long id; 

反正所提供的鏈接應提供你需要生成的ID的所有細節。

+0

好,但我的問題是說它的一個標識列的下一個值完全由數據庫決定,hibernate如何知道它更新的行具有主鍵值x。編輯我的問題 – vinothkr 2011-06-07 09:07:00

+0

我不確定您的意思,但標識符的值將被回傳,因爲它將設置在您插入的域實例上。 – 2011-06-07 10:45:57

+1

此外,數據庫用於ID的值取決於數據庫類型。 Oracle將使用SEQUENCE,MySQL自動遞增值等。 – 2011-06-07 10:49:03

0

當您使用序列派生代理主鍵創建一個對象時,您將它傳遞給Hibernate會話,並將該字段設置爲Hibernate解釋爲「未分配」的值,默認情況下爲0.此字段在相應的記錄未插入到數據庫表中之前,不會使用分配的值填充該值。您可以通過在hibernate會話中顯式調用flush()或在同一會話中讀取數據庫來觸發插入。之後,您可以檢查該字段的值,它將被分配而不是0.