我正在使用 Teneo/EMF/Hibernate,我做了一个简单的测试。
- 我创建了 2 个对象 A 和 B。A 与 B (B1) 具有一对多的非包含关系。
这是我的测试代码:
// LOAD A Session session = this.hbds.getSessionFactory().openSession(); Transaction transaction = session.beginTransaction(); A loadedA = (A)session.createQuery("FROM A a LEFT JOIN FETCH a.b1").list().get(0); transaction.commit(); session.flush(); session.close(); // LOAD B session = this.hbds.getSessionFactory().openSession(); transaction = session.beginTransaction(); B loadedB = (B)session.get("B", (Long)6L); transaction.commit(); session.flush(); session.close(); // ADD B TO A session = this.hbds.getSessionFactory().openSession(); transaction = session.beginTransaction(); loadedA.getB1().add(loadedB); //loadedA.getB1().add(b); session.saveOrUpdate(loadedA); transaction.commit(); session.flush(); session.close(); this.hbds.close();
- 以下是我对 Teneo 中选项 CASCADE_POLICY_ON_NON_CONTAINMENT 的不同配置以及我收到的相应错误消息:
- REFRESH、MERGE、PERSIST:org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联:[B#6]
- 刷新,合并:有效,但如果我创建一个不在数据库中的新对象“b”并尝试将其添加到 A,我收到以下错误:org.hibernate.TransientObjectException:对象引用了未保存的瞬态实例 - 保存刷新前的瞬态实例:B
您知道使用 saveOrUpdate 并避免这些错误的正确配置是什么吗?或者有什么办法可以避免这个问题?