【问题标题】:em.Persist(book) wont update entityem.Persist(book) 不会更新实体
【发布时间】:2013-05-25 21:33:01
【问题描述】:

我有一个具有自动生成 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吗?

【问题讨论】:

    标签: java jpa java-ee-6 entitymanager


    【解决方案1】:

    您的 addBook 方法需要返回持久化的实体。

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

    返回的实体将包含生成的 id。由于您已经恢复了持久化实体,因此您无需调用 getBook 方法。

    【讨论】:

    • 我目前正在为函数编写测试,所以我必须调用 getBook 方法:) 我会试试看!
    • 成功了!即使没有 konyv = em.merge(konyv); 也可以工作这条线让我感到惊讶。我真的不明白这一点。我读到持久化和合并都将实体置于“托管”状态,但我不明白为什么对同一对象的另一个引用不起作用,但返回它确实......:S
    • @Croo persist 方法会更新传递给它的实体的状态,但不会更改其引用。当你返回它时,更新的状态会被传回。
    • 奇怪的是,就我而言,问题中发布的代码按预期工作。即调用 addBook 后,book 包含生成的 ID。持久性提供程序是EclipseLink
    猜你喜欢
    • 1970-01-01
    • 2014-10-29
    • 2020-02-16
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 2013-04-02
    相关资源
    最近更新 更多