Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java em.Persist(book)不会更新实体_Java_Jpa_Java Ee 6_Entitymanager - Fatal编程技术网

Java em.Persist(book)不会更新实体

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

我有一个自动生成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=新书(“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