2012-07-24 90 views
0

我用戶JPA 2.0與eclipselink與postgres數據庫。Jpa 2.0 eclipselink如何堅持(插入)實體類,無需自動生成主鍵

我想要presist新的實體類。主鍵是一個Integer,不具有null約束。

當我插入一個,JPA不知道新的主鍵的值。

我怎樣才能得到新的主鍵值?

我無法更改數據塊區域。

我想要獲得最大ID並插入一個更大的數據庫,但它是一種凌亂的解決方案。

這是實體類的主鍵的定義,與NetBeans 7.0.1生成: @Id @Basic(可選=假) @Column(名稱= 「obj_id」) 私人整數OBJID;

public void save(){ 
    TkTopoVerzio test= new TkTest(); 
    // set all the value 
    // .... 

    try { 
      em.getTransaction().begin(); 
      em.persist(test); 
      em.getTransaction().commit(); 

    } catch(javax.persistence.NoResultException ex){ 
     //Todo : manage exception 
    } catch (Exception ex){ 
     // toDO : manage exception 
    } 

}

回答

0

如果這是一個現有的應用程序,它是如何分配的主鍵?
您可以直接在調用persist之前將pk分配給新對象,但EclipseLink還允許自定義pk生成器: http://wiki.eclipse.org/EclipseLink/Examples/JPA/CustomSequencing 這將允許您使用您需要的任何策略分配pk。

你所建議的問題(使用max來查找現有值)是,這很難成爲線程或甚至是多應用程序安全的。高度併發或分佈式應用程序可能會遇到pk重用問題。如果您不能使用面向數據庫的PK生成策略,UUID可能是更好的選擇。一個很好的資源在這裏: http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced_Sequencing