Опция cascade_policy_on_non_containment в Teneo
Я работаю с 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();
- Ниже приведены мои разные конфигурации для опции CASCADE_POLICY_ON_NON_CONTAINMENT в Teneo и соответствующие сообщения об ошибках, которые я получаю:
- REFRESH, MERGE, PERSIST: org.hibernate.NonUniqueObjectException: другой объект с тем же значением идентификатора уже был связан с сеансом: [B # 6]
- REFRESH, MERGE: работает, но если я создаю новый объект "b", которого нет в БД, и пытаюсь добавить его в A, я получаю следующую ошибку: org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр - сохранить переходный процесс перед промывкой: B
Знаете ли вы, какова правильная конфигурация для работы с saveOrUpdate и чтобы избежать этих ошибок? Или любое решение, чтобы избежать этой проблемы?
1 ответ
Решение
Мартин Таал ответил на мой вопрос в форуме Eclipse.