gpt4 book ai didi

java - 通过 Hibernate 保存实体时出现 org.hibernate.WrongClassException

转载 作者:行者123 更新时间:2023-12-02 14:38:43 24 4
gpt4 key购买 nike

在这个问题中,我正在使用 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 添加到卡片集合中并保存实体,则一切正常。但是,如果我向集合中添加 SkillCardInstance 并保存实体,则会失败并出现 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;
<小时/>

“卡片”的数据库条目
The database entries for "cards"
“cardinstances”的数据库条目
The database entries for "cardinstances"

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

预先感谢您提供有关如何解决此问题的任何线索。如果您需要更多信息,我很乐意更新我的问题!

最佳答案

根据first paragraph of the JavaDocs for @ManyToOne :

It is not normally necessary to specify the target entity explicitly since it can usually be inferred from the type of the object being referenced.

但是,在本例中,@ManyToOne 位于类型为泛型的字段上,并且泛型类型信息会在编译类型时被删除。因此,反序列化时,Hibernate 不知道字段的确切类型。

修复方法是将 targetEntity=Card.class 添加到 @ManyToOne。由于 Cardabstract 并且具有 @Inheritance@DiscriminatorColumn 注释,这会强制 Hibernate 解析实际的字段类型通过一切可能的方式。它使用 Card 表的鉴别器值来执行此操作并生成正确的类实例。另外,类型安全性保留在 Java 代码中。

<小时/>

因此,一般来说,每当运行时可能无法完全了解字段的类型时,请将 targetEntity@ManyToOne@OneToMany< 一起使用.

关于java - 通过 Hibernate 保存实体时出现 org.hibernate.WrongClassException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31257027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com