jpa 合并非托管实体

Posted

技术标签:

【中文标题】jpa 合并非托管实体【英文标题】:jpa merge unmanaged entity 【发布时间】:2013-11-13 19:17:12 【问题描述】:

我想在另一个持久性上下文中管理一个非托管实体。我读到这可以通过合并来实现:

em.merge(user);

但如果我这样做,它不会添加到上下文中:

boolean isManaged = em.contains(user);

总是假的。

即使我做了以下事情:

User dbuser = em.find(User.class, user.getId());
em.merge(user);
boolean isManaged = em.contains(user);

dbuser 和 user 完全一样。

我做错了什么?

我正在使用 JPA、mysql DB、JBoss EAP 6.1

【问题讨论】:

您是否开始并提交了事务?此外,请执行:dbuser = em.merge(user); 我可以使用 JPA(没有 Spring 等或本机 Hibernate)启动事务吗?我只是使用@TransactionManagement(TransactionManagementType.CONTAINER) 可以通过em.getTransaction()调用.begin().commit().rollback()获取交易对象。但是,在您的配置中,这可能不是必需的,甚至是不可能的(当使用 JTA EntityManager 时)。 user = em.merge(user);成功了。谢谢。 (即使没有 find()。正如预期的那样) 不客气。刚刚注意到,我不小心混淆了userdbuser... 【参考方案1】:

致电entityManager.flush()将您的合并操作提交到数据库中。

通常提交会延迟。例如,如果您的方法有 @TransactionAttribute 注释。方法完成后将提交事务。但是如果你在没有提交的情况下调用em.contains(user),你只会得到旧状态。

【讨论】:

以上是关于jpa 合并非托管实体的主要内容,如果未能解决你的问题,请参考以下文章

在 JPA 上是不是绕过托管实体

将WinForm程序(含多个非托管Dll)合并成一个exe的方法

将WinForm程序(含多个非托管Dll)合并成一个exe的方法

教义自定义存储库方法和非托管实体

结合 JPA、EJB 和 JSF 托管 bean 的首选设计模式是啥?

附加实体是否必须在JPA中合并?