2011-06-14 54 views
8

我正在使用Hibernate訪問MySQL,並且我有一個帶有自動遞增主鍵的表。如何在MySQL中使用Hibernate獲取自動遞增主鍵值

每次我向表中插入一行時,我不需要指定主鍵。但是當我插入一個新行後,我怎麼才能立即使用hibernate獲得相對主鍵?

或者我可以只使用jdbc來做到這一點?

回答

10

當您保存休眠實體時,id屬性將爲您填充。所以,如果你有

MyThing thing = new MyThing(); 
... 

// save the transient instance. 
dao.save(thing); 

// after the session flushes, thing.getId() should return the id. 

其實我幾乎總是在我的測試中持久實體的id做一個assertNotNull以確保保存工作。

+0

是否即使事務未提交和會話還沒有關閉這一點。 – Ace 2014-03-21 02:45:05

2

一旦你堅持這個對象,你應該能夠調用getId()或者你的@ID列,所以你可以從你的方法返回它。您也可以使Hibernate一級緩存失效並再次獲取它。

但是,爲了便於攜帶,您可能需要查看使用Hibernate進行序列樣式ID生成。如果您需要,這將緩解從MySQL過渡。當然,如果你使用發電機的這種風格,你就可以立即獲得ID,因爲Hibernate需要解決的列值是持續對象之前:

@Id 
@GeneratedValue (generator="MY_SEQ") 
@GenericGenerator(name = "MY_SEQ", 
    strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", 
    parameters = { 
     @Parameter(name = "sequence_name", value = "MY_SEQ"), 
     @Parameter(name = "initial_value", value = "1"), 
     @Parameter(name = "increment_size", value = "10") } 
     ) 
@Column (name = "id", nullable = false) 
public Long getId() { 

     return this.id; 
    } 

這是一個有點複雜,但它的除了改變SEQUENCE的名字外,你可以剪切和粘貼的東西。

0

當您在Hibernate中調用save()方法時,該對象不會立即寫入數據庫。當你試圖從數據庫讀取數據(來自同一張表?)或顯式調用flush()時,它會發生。直到相應的記錄沒有插入到數據庫表中,MySQL不會爲其分配一個id。

因此,id是可用的,但不是在Hibernate實際上將記錄插入MySQL表之前。

0

如果你願意,你可以獨立使用得到一個對象的下一個主鍵:

Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession(); 
Query query = session.createSQLQuery("select nextval('schemaName.keySequence')"); 

Long key = (Long) query.list().get(0); 
return key; 
0

井自動增量生成器類的情況下,當我們使用save()方法返回的主鍵(假設其id)。因此,它返回一個特定id,這樣你就可以做到這一點

int id = session.save(modelClass); 

,並返回id

相關問題