2011-02-02 84 views
7

我使用JPA的TopLink必要SQL Server 2008中爲什麼JPA persist()不會生成自動增加主ID?

我的目標是獲取將要插入到表中的數據的自動增量主鍵值。我知道在JDBC,有getInsertedId()之類的方法,讓你自動增量的主ID的ID(但儘管執行INSERT語句之後的)

在JPA中,我發現了@GenratedValue annotation可以做的伎倆。

@Entity 
@Table(name = "tableOne") 
public class TableOne implements Serializable { 
    private static final long serialVersionUID = 1L; 

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

現在,如果我運行下面的代碼,它應該給我的自動遞增的ID 但它返回NULL ...

EntityManager em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager(); 
EntityTransaction txn = em.getTransaction(); 
txn.begin(); 

TableOne parent = new TableOne(); 
em.persist(parent); //here I assume that id is pre-generated for me. 
System.out.println(parent.getTableId()); //this returns NULL :(
+0

我可以得到id如果我提交:em.getTransaction()。commit()但沒有辦法獲得id已經持續??? hmm – 2011-02-02 05:39:31

+0

您的代碼應該按照您的預期工作。我測試了它,並在提交之前得到了id,或者如果我回滾了。奇怪的是,它沒有。 – Joel 2011-02-02 11:02:42

+0

如果tableId是一個int而不是Integer,它會有什麼區別嗎? – Joel 2011-02-02 11:05:11

回答

2

我們還利用SQL Server 2008和它從來沒有爲我工作,所以我總是執行單獨的查詢"SELECT @@IDENTY"獲取插入的ID。

我在網上發現的原因是自動ID(IDENTITY)由數據庫管理,並且從未在實體中獲取,除非您提交該行或手動從數據庫檢索信息。

11

問題是您正在使用IDENTITY ID代。 IDENTITY ID生成不能進行預分配,因爲它們需要INSERT生成ID。 TABLE和SEQUENCE ID生成支持預分配,我總是會推薦使用這些,並且從不使用IDENTITY,因爲這個問題以及性能。

您可以通過調用flush()來觸發要在生成IDENTITY ID時生成的id。

6

只是單純地做到這一點:

​​

刷新你有正確的價值ID字段中的實體之後。