Java JPA-加载抽象属性的不同实现
我的JavaEE项目运行在WildFly 8上,使用的是JPA2.1。 有一个实体Person、一个抽象实体AbstractMatch和两个实体,它们实现了AbstractMatch:足球比赛和曲棍球比赛Java JPA-加载抽象属性的不同实现,java,jpa,abstract,Java,Jpa,Abstract,我的JavaEE项目运行在WildFly 8上,使用的是JPA2.1。 有一个实体Person、一个抽象实体AbstractMatch和两个实体,它们实现了AbstractMatch:足球比赛和曲棍球比赛 public class Person implements Serializable { private static final long serialVersionUID = 1L; @Id @Email @NotNull private String email;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Email
@NotNull
private String email;
@ManyToMany(targetEntity=FootballMatch.class)
private List<AbstractMatch> matches
}
@MappedSuperclass
public abstract class AbstractMatch implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
}
@Entity
public class FootballMatch extends AbstractMatchEntity {
}
public类Person实现可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@电子邮件
@NotNull
私人字符串电子邮件;
@ManyToMany(targetEntity=FootballMatch.class)
私有列表匹配
}
@映射超类
公共抽象类AbstractMatch实现了可序列化{
私有静态最终长serialVersionUID=1L;
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
保护长id;
}
@实体
公共类FootballMatch扩展了AbstractMatchEntity{
}
人与人之间有很多关系。ManyToMany注释的targetEntity属性定义要加载的类类型。因此,如果我从数据库中加载一个人,所有匹配项都将被强制转换为该类类型(在本例中为FootballMatch)。如何加载对象在持久化时拥有的原始类类型?通过在
IMatch
集合中使用泛型,可以避免使用targetEntity
。另外:IMatch
听起来像一个接口,但它不应该是一个在JPA中支持继承的抽象类吗?我说的是一个抽象类,使用@MappedSuperclass注释。我更新了问题以便更好地解释。我的问题不是定义数据库表,而是加载阶段。我想从数据库中加载一个人,所有abstractMatch对象(属性匹配)都应该具有持久化时的类类型。你不必担心。只需建模您的@manytomy
关系,而不需要targetEntity
。泛型类型信息AbstractMatch
就足够了。对于引用完整性,我建议不要将TABLE\u PER\u CLASS
作为继承策略与@manytomy
关系结合使用,因为这使得只有一个外键的n:m表不可能与AbstractMatch
实体匹配。我认为“targetEntity”是必要的,因为如果我没有指定它,就会引发异常。在你回答之后,我又试了一次,结果成功了。所以谢谢:)