Опция 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.

http://www.eclipse.org/forums/index.php/m/1096426/

Другие вопросы по тегам