Java em.Persist(book)不会更新实体
我有一个自动生成id的新JPA实体,并将其持久化。 之后,我想再次获取它,修改它并保留更改 新实体使用自动生成的id持久化到数据库中,但该实体的Java em.Persist(book)不会更新实体,java,jpa,java-ee-6,entitymanager,Java,Jpa,Java Ee 6,Entitymanager,我有一个自动生成id的新JPA实体,并将其持久化。 之后,我想再次获取它,修改它并保留更改 新实体使用自动生成的id持久化到数据库中,但该实体的bookid仍然为空。 这样我就不能使用getBook(id)函数再次找到它 @Stateless public class BookManager implements BookManagerRemote { @PersistenceContext EntityManager em; @EJB Authenticat
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=新书(“Stanislaw Lem”、“Kibeliada”);
bookmanager.addBook(名称,输入错误);
Book whopsBook=bookmanager.getBook(名称,mistypedBook.getBookid()/*您的addBook方法需要返回持久化实体
em.persist(konyv);
konyv = em.merge(konyv);
return konyv;
返回的实体将包含生成的id。由于已返回持久化实体,因此不需要调用getBook方法。您的addBook方法需要返回持久化实体
em.persist(konyv);
konyv = em.merge(konyv);
return konyv;
返回的实体将包含生成的id。由于您已返回持久化实体,因此不需要调用getBook方法。我目前正在为函数编写测试,因此我必须调用getBook方法:)我将尝试!成功了!即使没有konyv=em.merge(konyv),它也可以工作;这句话让我很惊讶。我真的不明白。我读到persist和merge都将实体置于“托管”状态,但我不明白为什么对同一对象的另一个引用不起作用,但返回它却起作用…:S@Croopersist方法更新传递给它的实体的状态,但不更改其引用。当你返回它时,更新的状态被传回。奇怪的是,在我的例子中,问题中的代码按预期工作。也就是说,在调用addBook之后,该书包含生成的ID。持久性提供程序是EclipseLink
。我目前正在为函数编写测试,因此我必须调用getBook方法:)我将尝试它!成功了!即使没有konyv=em.merge(konyv),它也可以工作;这句话让我很惊讶。我真的不明白。我读到persist和merge都将实体置于“托管”状态,但我不明白为什么对同一对象的另一个引用不起作用,但返回它却起作用…:S@Croopersist方法更新传递给它的实体的状态,但不更改其引用。当你返回它时,更新的状态被传回。奇怪的是,在我的例子中,问题中的代码按预期工作。也就是说,在调用addBook之后,该书包含生成的ID。持久性提供程序是EclipseLink
。