我有一个实体层次结构:它扩展ATeamEntity
并包含.
并延伸
和延伸。BTeamEntity
BaseTeamEntity
UserEntity
BaseTeamEntity
BaseTeamEntity
UserEntity
BaseEntity
BaseEntity
PanacheEntityBase
我已经定义UserEntity
以一种懒惰的方式获取BaseTeamEntity
,我正在尝试执行如下向下转换:
UserEntity user = UserEntity.findById(1L);
BaseTeamEntity team = user.team;
ATeamEntity ateam = (ATeamEntity)team; <--
Long a = ateam.aData;
当我这样做时,我遇到了一个例外:
java.lang.ClassCastException: class ***.***.entities.team.BaseTeamEntity$HibernateProxy$YcDcMejE cannot be cast to class ***.***.entities.team.ATeamEntity (***.***.entities.team.BaseTeamEntity$HibernateProxy$YcDcMejE and ***.***.entities.team.ATeamEntity are in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @4f636cba)
如果我想直接沮丧而不是通过UserEntity
这样的:
BaseTeamEntity team = BaseTeamEntity.findById(1L);
ATeamEntity ateam = (ATeamEntity)team; <--
Long a = ateam.aData;
它似乎工作。
当我BaseTeamEntity
以UserEntity
一种渴望的方式进入时,两种方式似乎都有效。
我不明白为什么...有人可以帮我理解为什么吗?
以下是类的高级结构
@MappedSuperclass
public class BaseEntity extends PanacheEntityBase {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
}
@Entity
@Table(name = "users")
public class UserEntity extends BaseEntity {
@ManyToOne(fetch = FetchType.LAZY) <------------ throws exception
@ManyToOne(fetch = FetchType.EAGER) <--------- working
@JsonbTransient
public BaseTeamEntity team;
}
@Inheritance(strategy = InheritanceType.JOINED)
@Entity
@Table(name = "teams")
@DiscriminatorColumn(name = "team_type", discriminatorType = DiscriminatorType.STRING)
public abstract class BaseTeamEntity extends BaseEntity {
public String sharedData;
}
@Entity
@Table(name = "teams_A")
@DiscriminatorValue("team_A")
@PrimaryKeyJoinColumn
public class ATeamEntity extends BaseTeamEntity {
public Long aData;
}
@Entity
@Table(name = "teams_B")
@DiscriminatorValue("team_B")
@PrimaryKeyJoinColumn
public class BTeamEntity extends BaseTeamEntity {
public Integer bData;
}