Обновите список OneToMany после того, как объект сохраняет в, в спящем режиме

у меня есть отношения:

// In A.java class
@OneToMany(mappedBy="a", fetch=FetchType.LAZY)
@Cascade(CascadeType.SAVE_UPDATE)
private List<B> bList;

// In B.java class
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_a")
@Cascade(CascadeType.SAVE_UPDATE)
private A a;

Теперь посмотрите это:

A a=new A();
// setting A

B b=new B();
// setting B
b.setA(a);

session.save(b); // this save b and a obviously

Теперь "проблема":

  • a.getId ()-> текущий новый идентификатор хорошо
  • a.getBList ()-> все еще пустой...

Так, почему bList не является обновлением в этом случае?

Я пытался перезагрузить после того, как сохраняют, таким образом:

A a=new A();
// setting A

B b=new B();
// setting B
b.setA(a);

session.save(b);

A loadedA=(A)session.get(A, a.getId());

Но loadedA все еще имеют ПУСТОЙ УКАЗАТЕЛЬ bList как a.

Естественно для предотвращения этой проблемы я делаю в вашем пути:

A a=new A();
// setting A

B b=new B();
// setting B

List<B> bList=new ArrayList<B>();
bList.add(b);
a.setBList(bList);

session.save(a); // this save a and b

Таким образом вся хорошая работа, но мой вопрос: Почему идентификатор является правильно обновлением после того, как сохранят операцию и bList нет? Я должен запросить дб с избранным оператором для перезагрузки экземпляра правильно?


ОБНОВЛЕНИЕ

У меня есть это исключение

StaleStateException: Пакетное обновление возвратило неожиданное количество строки из обновления

когда я пробую к saveOrUpdate объекту после удаления b от него.

// first delete old b record
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
a.getBList().remove(b);
b.setA(null);
session.delete(b);
// session.clear(); // this would solve my problem, but is it correct??
session.getTransaction().commit();

// then insert new b record
Session session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
B b=new B();
a.getBList().add(b);
b.setA(a);
session.saveOrUpdate(a);   
session.getTransaction().commit(); // this throw exception

эти две операции не находятся в том же методе, конечно, запущены gui событием.

session.clear является действительным решением? Я делаю (вероятно), неправильно?

обновление

удаление session.delete (b) проблема решено снова... так, каков corretc путь? Я знаю... im полностью, новичок с в спящем режиме..

7
задан Pascal Thivent 26 June 2010 в 00:12
поделиться

2 ответа

Oh... ok

session.refresh(a);

Это хорошо работает... это решение, не так ли?

4
ответ дан 7 December 2019 в 01:16
поделиться

При работе с двунаправленными ассоциациями вам нужно установить связь на обеих сторонах ассоциации:

A a = new A();
B b = new B();
a.getBList().add(b);
b.setA(a);

session.persist(b);

И на самом деле, общий шаблон заключается в реализации защитных методов управления связями вот так:

public class A {

    @OneToMany(mappedBy="a", fetch=FetchType.LAZY)
    @Cascade(CascadeType.SAVE_UPDATE)
    private List<B> bList = new ArrayList<B>();

    protected List<B> getListB() {
        return bList;
    }

    protected void setListB(List bList) {
        this.bList = bList;
    }

    public void addBToBs(B b) {
        bList.add(b);
        b.setA(this);
    }

    //...
}

И код становится:

A a = new A();
B b = new B();
a.addBToBs(b);

session.persist(b);

Это обсуждается в учебнике Hibernate:

6
ответ дан 7 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: