在这个问题中,我正在使用 Hibernate 4.3.4.Final 和 Spring ORM 4.1.2.RELEASE。
我有一个 User 类,它包含一组 CardInstances,如下所示:
@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 = this.entityManager.createQuery("FROM User u " +
"WHERE u.id = ?1", User.class)
.setParameter(1, id)
.getSingleResult();
Hibernate.initialize(user.getCards());
return user;
“卡片”
的数据库条目 “卡片实例”的数据库条目
org.hibernate.WrongClassException: Object [id=1] was not of the specified subclass [org.gwentonline.model.cards.UnitCard] : Discriminator: leader
提前感谢您提供如何解决此问题的任何线索。如果您需要更多信息,我很乐意更新我的问题!