2013-05-25 26 views
1

我有一個新的JPA實體與自動生成的ID,我堅持它。 之後,我想再次獲取它,修改它並堅持更改。em.Persist(書)不會更新實體

新實體通過自動生成的ID保存到數據庫中,但實體的bookid保留爲空。 這樣我就不能使用getBook(id)函數再次找到它。

@Stateless 
public class BookManager implements BookManagerRemote { 

    @PersistenceContext 
    EntityManager em; 

    @EJB 
    Authenticator auth; 

    public BookManager() { 
    } 

    @Override 
    public void addBook(String user, Konyv konyv) throws InsufficentPrivilegesException { 
     if (auth.isAdmin(user)) { 
      em.persist(konyv);  
     } else { 
      throw new InsufficentPrivilegesException(); 
     } 
    } 

@Override 
    public Konyv getBook(String user, Integer bookid) throws InsufficentPrivilegesException { 
     if (auth.isAdmin(user)) { 
      return em.find(Konyv.class, bookid); 
     } else { 
      throw new InsufficentPrivilegesException(); 
     } 
    } 
} 

-

Book mistypedBook = new Book("Stanislaw Lem", "Kibeliada"); 
bookmanager.addBook(name, mistypedBook); 

Book whopsBook = bookmanager.getBook(name, mistypedBook.getBookid()/*<-ID IS NULL*/); 

我如何可以同步與數據庫中的新實體持續? 我見過JPA Container managed entity update after persist的問題,但我試圖在方法結束後使用實體的id。它不應該有那個ID?

回答

1

您的addBook方法需要返回持久實體。

em.persist(konyv); 
konyv = em.merge(konyv); 
return konyv; 

返回的實體將包含生成的ID。隨着持久實體返回,您不需要調用getBook方法。

+0

我目前正在爲函數編寫測試,所以我必須調用getBook方法:) 我會試試! – Croo

+1

它的工作! 它甚至沒有konyv = em.merge(konyv);這讓我驚歎不已。我真的不明白這一點。 我讀了堅持和合並都把實體置於「託管」狀態,但我不明白怎麼可能,該同一對象的另一個參考不起作用,但返回它確實......:S – Croo

+0

@Croo The persist方法更新傳遞給它的實體的狀態,但它不會更改其引用。當你返回它時,更新的狀態會被傳回。 – JamesB