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

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

@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... С ЖЕ ЗНАЧЕНИЯМИ, КОТОРЫЕ УЖЕ СУЩЕСТВУЮТ В ТЕКУЩЕМ B).

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

ПРИМЕЧАНИЯ:

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

em.merge(a);

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

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

СПАСИБО!!!


person Bork    schedule 15.01.2011    source источник
comment
Ваш вопрос действительно сбивает с толку. Что ты спрашиваешь?   -  person jzd    schedule 15.01.2011
comment
Можете ли вы предоставить дополнительную информацию о вашей модели, например свойства идентификатора и т. д.?   -  person Timo Westkämper    schedule 15.01.2011


Ответы (1)


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

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

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 (что, как мне кажется, вы делаете в отношении своих тегов), нормально, что изменения в управляемых объектах сохраняются. Это был вопрос?

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

person ymajoros    schedule 26.03.2011