jpa Hibernate EntityExistsException如果尝试延迟获取OneToOne关联 您所在的位置:网站首页 hibernate与jpa jpa Hibernate EntityExistsException如果尝试延迟获取OneToOne关联

jpa Hibernate EntityExistsException如果尝试延迟获取OneToOne关联

2023-04-13 06:02| 来源: 网络整理| 查看: 265

我有一对一的双向关联Account Budget。根据this,我尝试延迟加载关联:对于Account.java:

@Audited @Entity public class Account { @Id @GeneratedValue(strategy = GenerationType.TABLE) protected long id; @OneToOne(mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval=true, fetch=FetchType.LAZY) private Budget mainBudget; } ... }

对于Budget.java:

@Audited @Entity public class Budget { @Id @GeneratedValue(strategy = GenerationType.TABLE) protected long id; @OneToOne(fetch=FetchType.LAZY) @MapsId private Account account; @OneToMany(targetEntity = Budget.class, cascade = CascadeType.ALL, mappedBy = "parentBudget", orphanRemoval=true) @Fetch(value = FetchMode.SUBSELECT) private List subBudget; ... }

现在,我正在尝试使用DAOClass中的create-方法创建一个新帐户,并使用新预算,如下所示:

@Resource(name = "DBRouter", type = DatabaseRouter.class) protected DatabaseRouter router; @PersistenceContext protected EntityManager em; @Transactional public D create(D d, boolean flush, String resource) { router.setDataSource(resource); if (flush) { em.flush(); } D obj = em.merge(d); if (flush) { em.flush(); } return obj; }

这给了我以下例外:

javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [[PACKACKENAMES].Account#50](31 internal lines) at org.apache.openejb.persistence.JtaEntityManager.merge(JtaEntityManager.java:203) at [PACKACKENAMES].DAOClass.create(DaoClass.java:75) at [PACKACKENAMES].DaoClass.create(DaoClass.java:66) ...

如果我删除了@MapsId注解,那么我就不会有这个问题,尽管这样延迟加载就不能正常工作了。这个异常的原因是什么?如何解决?



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有