EntityNotFoundException при сохранении объектов, ссылающихся друг на друга - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть класс B, у которого есть набор объектов класса A. Объекты из класса A могут ссылаться друг на друга.Поэтому я загружаю объект из класса B, в который уже добавлен один объект из класса A.Теперь я добавляю новый объект из класса A, на который будет ссылаться первый.Когда я пытаюсь сохранить это, большую часть времени это заканчивается исключением EntityNotFoundException.Я мог бы попытаться сохранить от последнего элемента к первому, но это не будет работать, если вы видите этот пример:

    public class A implements java.io.Serializable {

    private BigInteger id;
    private A succes;
    private A fail;

    public A(BigInteger id) {
        this.id = id;
    }

    public void setSuccess(A a) {
        this.success = a;
    }

    public void setFail(A a) {
        this.fail = a;
    }

}

public class B implements java.io.Serializable {

    private Set<A> setA = new HashSet<A>();

    public void addA(A a) {
        this.setA.add(a);
    }

    public Set<A> getSetA() {
        return this.setA;
    }

}

public class Util {

    public static void update(B b) throws JDBCException, PSQLException {
        EntityManager em = null;
        EntityTransaction tx = null;
        try {
            em = HibernateUtil.getEntityManagerFactory().createEntityManager();
            tx = em.getTransaction();
            tx.begin();
            em.merge(b);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            logger.error(e);
            e.printStackTrace();
            Throwable cause = e.getCause();
            if (cause instanceof JDBCException) {
                throw (JDBCException) cause;
            }
            if (cause instanceof PSQLException) {
                throw (PSQLException) cause;
            }
        } finally {
            em.close();
        }
    }

    public static BigInteger getNextID() {
        // returns next value of sequence
    }

}

public static void main(String[] args) {

    B b = ... // load from DB
    A a1 = b.getSetA.get(0);
    A a2 = new A(Util.getNextID());
    A a3 = new A(Util.getNextID());
    A a4 = new A(Util.getNextID());
    a1.setSuccess(a2);
    a2.setSuccess(a3);
    a3.setSuccess(a4);
    a4.setFail(a2);
    b.addA(a2);
    b.addA(a3);
    b.addA(a4);
    Util.update(b); // throws javax.persistence.EntityNotFoundException Unable to find A with id xxx

}

Из XML-HBM-файла класса B:

<set embed-xml="true" fetch="select" cascade="all-delete-orphan"
    lazy="true" mutable="true" name="A"
    optimistic-lock="true" table="A" inverse="true"
    sort="unsorted">
    <key>
        <column name="A_ID" />
    </key>
    <one-to-many
        class="A" embed-xml="true"
        not-found="exception" />
</set>

Как мне решить эту проблему?

Редактировать: я могу использовать

em.unwrap(Session.class).update("B", b);

Но это заканчивается IllegalArgumentException: удаление отсоединенного экземпляра при удалении объекта из класса A.

...