2

Hibernate 4.0.0.Final に裏打ちされた JPA 2.0 アノテーションを使用して、同じ階層の各サブクラスのコレクションを 1 つの所有クラスにマップする方法を知っている人はいますか?

少し複雑なので、ここに例を示します。階層クラスは次のようになります。


    @Entity
    @Cacheable(true)
    @Table(name = "hierarcicals")
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name = "class", discriminatorType = DiscriminatorType.STRING)
    public abstract class MySuperClass {
    ...

    @Entity
    @DiscriminatorValue("SubClassOne")
    public class SubClassOne extends MySuperClass {
    ...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "owner")
    private Owner owner;

    @Entity
    @DiscriminatorValue("SubClassTwo")
    public class SubClassTwo extends MySuperClass {
    ...

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "owner")
    private Owner owner;

これはすべて問題ないように見えます。オブジェクトを永続化すると、オブジェクトが適切な識別子と適切な所有者とともにデータベースに格納されることがわかります。

これが私の「所有」クラスです-その注釈について特別なことは何もありません:

@Entity
@Cacheable(true)
@Table(name = "owner")
public class Owner  {
...
@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
private List<SubClassOne> subClassOnes;

@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
private List<SubClassTwo> subClassTwos;
...

2 つの List コレクションにはゲッターがあります。getSubClassOnes() を呼び出すと、関連付けられているすべてのエンティティのバッグが、SubClassOne 型として返されます。データベースに SubClassTwo 識別子があるエンティティも含まれます。getSubClassTwos() を呼び出すと、SubClassTwos のバッグのように見えるものを取得しますが、実行時にコレクションを反復処理すると、これが爆発します

initialize(AbstractPersistentCollection.java:379) [hibernate-c at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:112) [hibernate-core-4. org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266) [hibernate-core-4.0.0.Final.jar:4.0.0.Final] で

私が実現したいのは、getSubClassOnes() がクラス SubClassOnes を持つ所有者に関連付けられたコレクションを含むコレクションを返し、getSubClassTwos() が関連する SubClassTwos を持つコレクションを返すことです。どうすればこれを達成できるか知っている人はいますか?

4

1 に答える 1

0

私たちにとって、これは次のようにスーパークラスを指す注釈にtargetEntity属性を追加することで修正されました。@OneToMany

@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY, targetEntity = MySuperClass.class)
private List<SubClassOne> subClassOnes;

@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY, targetEntity = MySuperClass.class)
private List<SubClassTwo> subClassTwos;
于 2014-10-15T08:36:16.677 に答える