2011-06-10 106 views
1

我正在使用MySql 5.02數據庫開發J2EE 6 Web應用程序。我試圖生成一個ID的哈希摘要,每次我創建一個新的實體。這被設置爲表格中的一列。獲取新持久實體的ID(PK)

但是,我被困在顯然很容易的東西上,並且根據我發現的搜索結果,可能。基本上我想檢索新持久對象的ID(主鍵),但無論我嘗試什麼,它都會返回null。

的步驟如下是:

  1. 創建實體的實例 - >userCard = new Users();
  2. 設置一些值對應的字段。
  3. 調用EntityManagerpersist()方法。

閱讀一些論壇上後,我明白我必須persist()後,無論是打電話flush(),或使用merge()和使用返回的實體來檢索ID。他們的

public void createAndFlush(Users users) { 
    em.persist(users); 
    em.flush(); 
} 

public Integer edit(Users users) { 
    return ((Users)em.merge(users)).getIdvcards(); 
} 

無(其他一些組合中)的工作,那麼,實體被成功地堅持着,但ID字段返回null。

這些是我想要檢索的ID列的correspinding註釋:

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "idvcards") 
private Integer idvcards; 

而且很明顯,我的表的列idvcards設置爲自動遞增和主鍵。

也許我只是需要澄清我的Peristence-Management概念,但是如果我能得到一些提示來解決這個基本問題,我將不勝感激。

回答

2

也許不是有史以來最完美的解決方案,但最後我succeded上檢索新實體的ID:

public Integer create(User user) { 
    em.persist(users); 
    em.flush(); 
    return (Integer) em.getEntityManagerFactory().getPersistenceUnitUtil().getIdentifier(users); 
} 

很好,althought是不相關的功能,我改變了實體名稱作爲@Bohemian提出的單數形式。

+0

我贊成你張貼結果和友好評論:) – Bohemian 2011-06-10 10:28:21

+0

也爲我工作,謝謝。 – Puckl 2013-04-09 22:17:02

1

試試這個,它爲我工作:

@Id 
@GeneratedValue 
@Column(name = "id", unique = true, nullable = false) 

另外,我不使用從merge返回的值。我只是persist然後flush和實體對象奇蹟般地獲取新的鍵值。

p.s.表格不應該以複數形式命名,尤其不能以實體類別命名。致電User(如果可以的話)表格。否則,它只是令人困惑:Users聽起來像一個User的集合。

+0

感謝提示和建議(我同意實體應該以單數形式命名),但不幸的是沒有'strategy'屬性,persist()'拋出一個'DatabaseExcept ion'。它似乎試圖找到一個名爲「序列」的表,我認爲這將是定義序列所必需的,因爲我沒有聲明「GenerationType」。 – mdelolmo 2011-06-10 09:08:48

0

它會正常工作

em.persist(usmApproveTransaction); 
em.flush(); 

System.out.println("++++++e++++++++"+usmApproveTransaction.getUatApproveTransIdPk()); 
return usmApproveTransaction; 

我收到後使用em.flush(); ID persist

++++++Ë++++++++ 51472