JPA 2.0 и EJB 3.1 - обновить отношение на стороне владельца, пытаясь вставить запись? - PullRequest
2 голосов
/ 15 января 2011

У меня есть модель:

@Entity
class A {
   @ManyToOne
   B b;
   int i;
}

@Entity
class B {
   @OneToMany(mappedBy="b")
   List< A > list = new ArrayList< A >();
}

Теперь в моем EJB-сервисе я делаю:

void f(Aid,Bid){
   A a = em.find(A.class, Aid);
   B b = em.find(B.class, Bid);
   a.setB(b);
}

Это исключение ограничения броска БД (ВСТАВИТЬ В ЗНАЧЕНИЯ B ... ... С ТОЛЬКО ЖЕЧТО УЖЕ СУЩЕСТВУЕТ В ТЕКУЩЕМ Б).

  1. Почему он пытается вставить новую запись в Б, когда она уже существует в таблице Б, а связь не PERSIST?

ПРИМЕЧАНИЯ:

1 Когда я делаю после последней строки:

em.merge(a);

Это тоже работает ... ???

2 Когда я делаю a.setI(1);без слияния - он изменился в БД (как я и думал)

СПАСИБО !!!

1 Ответ

0 голосов
/ 26 марта 2011

Это двусторонние отношения. Вы должны всегда обновлять обе стороны кораблей отношений. В противном случае, если у вас напрямую не возникнет проблем при сохранении, вы можете легко повредить кеш и столкнуться с некоторыми странными ошибками в вашем приложении.

Итак, если у вас есть это:

A a = em.find(A.class, Aid);
B b = em.find(B.class, Bid);
a.setB(b);

Вы должны добавить это сразу после:

List<A> aList = b.getList();
if (!aList.contains(b)) {
    aList.add(b);
}

2 Когда я делаю a.setI (1); без слияния - это изменилось в БД (как я и думал будет)

Если вы используете entityManager в ejb (что, как мне кажется, вы делаете с вашими тегами), это нормально, что изменения в управляемых объектах сохраняются. Это был вопрос?

Кроме того, вы должны убедиться, что сущности identity, equals () и hashcode () определены правильно (возможно, это так, но вы не упомянули об этом).

...