jpa Hibernate EntityExistsException如果尝试延迟获取OneToOne关联 | 您所在的位置:网站首页 › hibernate与jpa › jpa Hibernate EntityExistsException如果尝试延迟获取OneToOne关联 |
我有一对一的双向关联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 实验室设备网 版权所有 |