2013-05-25 17 views
3

我真的不明白。JPA內部運作

如果我堅持一個新的項目,然後用它來得到自動生成的關鍵,它失敗:

class BookManagerBean { 
    @PersistentContext 
    EntityManager em; 

    @Override 
    public void addBook(Book book) {   
      em.persist(book);     
    } 
} 
//...somewhere else 
@GetThisObjectByJNDI-OrInject 
BookManagerRemote bookManager;  

Book book = new Book("Writer","Title"); 
bookManager.addBook(book); 
book.getBookid() //<--NULL, didn't get synched, but new data with id in DB is fine 

但是,如果我回到持久化的項目,它的工作原理:

class BookManagerBean { 
    @PersistentContext 
    EntityManager em; 

    @Override 
    public Book addBook(Book book) {   
      em.persist(book); 
      return book;      
    } 
} 

//...somewhere else 
@GetThisObjectByJNDI-OrInject 
BookManagerRemote bookManager;  

Book book = new Book("Writer","Title"); 
bookManager.book = addBook(book); 
book.getBookid() // <--- Auto-generated id is right here! It's synched! 

如何這可能嗎?

+0

您正在使用哪個持久性提供程序?休眠?的EclipseLink? –

+0

檢查返回的書是否是傳入addBook的同一實例。序列化可能在遠程傳遞時發生。 – Chris

+0

@Kevin EclipseLink – Croo

回答

2

我假設您正在遠程訪問BookManagerBean,或者作爲遠程訪問,因此Book將被序列化,因此該ID被分配給不同的副本,並且只有在您返回時才能從客戶端訪問。

要麼將​​其返回,要麼將bean更改爲本地,而不是遠程。

+0

你是對的!我正在通過BookManagerRemote接口訪問bookManager。 – Croo