3

この質問では、Hibernate 4.3.4.Final および Spring ORM 4.1.2.RELEASE を使用しています。

次のような CardInstances のセットを保持する User クラスがあります。

@Entity
@Table
public class User implements UserDetails {

    protected List<CardInstance> cards;

    @ManyToMany
    public List<CardInstance> getCards() {
        return cards;
    }

    // setter and other members/methods omitted 
}

@Table
@Entity
@Inheritance
@DiscriminatorColumn(name = "card_type", discriminatorType = DiscriminatorType.STRING)
public abstract class CardInstance<T extends Card> {

    private T card;

    @ManyToOne
    public T getCard() {
        return card;
    }
}

@Table
@Entity
@Inheritance
@DiscriminatorOptions(force = true)
@DiscriminatorColumn(name = "card_type", discriminatorType = DiscriminatorType.STRING)
public abstract class Card {
    // nothing interesting here
}

いくつかの種類のカードがあり、それぞれ次のように Card 基本クラスと CardInstance 基本クラスをそれぞれ拡張します。

@Entity
@DiscriminatorValue("unit")
public class UnitCardInstance extends CardInstance<UnitCard> {
    // all types of CardInstances extend only the CardInstance<T> class
}

@Entity
@DiscriminatorValue("leader")
public class LeaderCardInstance extends CardInstance<LeaderCard> {

}

@Entity
@DiscriminatorValue("unit")
public class UnitCard extends Card {
}

@Entity
@DiscriminatorValue("leader")
public class LeaderCard extends AbilityCard {
}

@Entity
@DiscriminatorValue("hero")
public class HeroCard extends UnitCard {
    // card classes (you could call them the definitions of cards) can
    // extend other types of cards, not only the base class
}

@Entity
@DiscriminatorValue("ability")
public class AbilityCard extends Card {
}

UnitCardInstance または HeroCardInstance をカード コレクションに追加してエンティティを保存すると、すべて正常に動作します。しかし、AbilityCardInstance をコレクションに追加してエンティティを保存すると、org.hibernate.WrongClassException で失敗します。投稿の下部に正確な例外とメッセージを追加しました。

いくつかの質問を読みましたが、基本クラスのコレクションを操作しているときに遅延読み込みが問題になるようです。そのため、カードを追加して保存する前に User エンティティを読み込む方法は次のとおりです。

User user = this.entityManager.createQuery("FROM User u " +
                "WHERE u.id = ?1", User.class)
                .setParameter(1, id)
                .getSingleResult();

        Hibernate.initialize(user.getCards());

        return user;

「cards」
のデータベース エントリ
のデータベース エントリ 「cardinstances」のデータベース エントリ
のデータベース エントリ


org.hibernate.WrongClassException: Object [id=1] was not of the specified subclass [org.gwentonline.model.cards.UnitCard] : Discriminator: leader

この問題を解決する方法の手がかりを事前にありがとう。追加情報が必要な場合は、喜んで質問を更新します。

4

2 に答える 2