我正在使用Hibernate訪問MySQL,並且我有一個帶有自動遞增主鍵的表。如何在MySQL中使用Hibernate獲取自動遞增主鍵值
每次我向表中插入一行時,我不需要指定主鍵。但是當我插入一個新行後,我怎麼才能立即使用hibernate獲得相對主鍵?
或者我可以只使用jdbc來做到這一點?
我正在使用Hibernate訪問MySQL,並且我有一個帶有自動遞增主鍵的表。如何在MySQL中使用Hibernate獲取自動遞增主鍵值
每次我向表中插入一行時,我不需要指定主鍵。但是當我插入一個新行後,我怎麼才能立即使用hibernate獲得相對主鍵?
或者我可以只使用jdbc來做到這一點?
當您保存休眠實體時,id
屬性將爲您填充。所以,如果你有
MyThing thing = new MyThing();
...
// save the transient instance.
dao.save(thing);
// after the session flushes, thing.getId() should return the id.
其實我幾乎總是在我的測試中持久實體的id做一個assertNotNull
以確保保存工作。
一旦你堅持這個對象,你應該能夠調用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的名字外,你可以剪切和粘貼的東西。
當您在Hibernate中調用save()方法時,該對象不會立即寫入數據庫。當你試圖從數據庫讀取數據(來自同一張表?)或顯式調用flush()時,它會發生。直到相應的記錄沒有插入到數據庫表中,MySQL不會爲其分配一個id。
因此,id是可用的,但不是在Hibernate實際上將記錄插入MySQL表之前。
如果你願意,你可以獨立使用得到一個對象的下一個主鍵:
Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
Query query = session.createSQLQuery("select nextval('schemaName.keySequence')");
Long key = (Long) query.list().get(0);
return key;
井自動增量生成器類的情況下,當我們使用save()
方法返回的主鍵(假設其id
)。因此,它返回一個特定id
,這樣你就可以做到這一點
int id = session.save(modelClass);
,並返回id
是否即使事務未提交和會話還沒有關閉這一點。 – Ace 2014-03-21 02:45:05