Транзитивный порядок персистенции в спящем режиме - PullRequest
1 голос
/ 03 декабря 2011

У меня есть 2 родительских класса A, C и 2 ребенка: B, D. В обоих отношениях разрешено транзитивное постоянство. Однако для сохранения D требуется, чтобы B был постоянным.

class A {
    @OneToMany(cascade = {CascadeType.PERSIST}, mappedBy = "a")
    public Set<B> getBs() {
     ...
    }
}

class B {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "a_id", nullable = false)
    public A getA() {
      ...
    }
}

class C {
    @OneToMany(cascade = {CascadeType.PERSIST}, mappedBy = "c")
    public Set<D> getDs() {
       ...
    }
}

class D {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "b_id", nullable = false)
    public B getB() {
      ...
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "c_id", nullable = false)
    public C getC() {
      ...
    }
}

Я пытаюсь сохранить B и D в одном кадре:

A a = entityManager.getReference(...);
C c = entityManager.getReference(...);

B b = new B();

D d = new D();
d.setB(b);

a.add(b);
b.setA(a);

c.add(d);
d.setC(c);

entityManager.flush();

Полагаю, это должно быть возможно. Однако я получаю TransientObjectException, говорящий, что B должен быть постоянным при попытке сохранить D.

Есть ли определенный порядок каскадных отношений, обрабатываемых hibernate?

1 Ответ

2 голосов
/ 03 декабря 2011

Когда вы сбрасываете, d становится постоянным благодаря каскаду от C до D. Но каскада от D до B нет, поэтому Hibernate жалуется. Перед тем, как D сработает, необходимо сбросить A, но нет никаких причин иметь какой-либо определенный порядок между A и D.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...