У меня есть класс 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.