2

私はクラスA、B、およびCを持っています。AにはB(manytoone)に対するプロパティがあり、BにはC(onetomany)に対するプロパティがあります。クラスは次のようになります (関連するプロパティへの短縮)。

class A {
    [...]
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "fkb", nullable = false)
    private B b;
    [...]
}

class B {
    [...]
    @OneToMany(mappedBy = "b")
    @Cascade(value = { CascadeType.ALL })
    private Set<C> cs;

    public Set<C> getCs() {
    return cs;
    }
    [...]
}

class C {
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "fkb", nullable = false)
    private B b;
}

問題は、As と B をロードする順序によっては、B の C のコレクションが機能しなくなったことです。

// outputs correct count of Cs per B
List<B> bs = session.createCriteria(B.class).list();
for (B b : bs) {
  System.out.println(b.getCs().size());
}

// outputs always 0
List<A> as = session.createCriteria(A.class).list();
List<B> bs = session.createCriteria(B.class).list();
for (B b : bs) {
  System.out.println(b.getCs().size());
}

次のデバッグはすでに行っています:

  • 2 番目のコードでは、hibernate は Cs をロードする select ステートメントをトリガーしません
  • 最初のコードでは、返される B は B 型で、C のセットは org.hibernate.collection.PersistentSet 型です。
  • 2 番目のコードでは、返された B の型は B_$$_javassist_58 であり、C のセットの型は java.util.HashSet です。

休止状態 3.8.3 を使用しています。

4

1 に答える 1