我有一个带有自动生成 ID 的新 JPA 实体,并且我保留它。 之后我想再次获取它,修改它并保存更改。
新实体使用自动生成的 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了吗?
最佳答案
您的 addBook 方法需要返回持久化实体。
em.persist(konyv);
konyv = em.merge(konyv);
return konyv;
返回的实体将包含生成的 ID。由于您已恢复持久化实体,因此无需调用 getBook 方法。
关于java - em.Persist(book) 不会更新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16754107/