如何映射抽象的JPA基础实体?

时间:2014-08-26 02:31:51

标签: jpa mapping

相当简单的情况,但我遇到了找到工作映射的问题。示例剥离了最基本的问题。

两个实体:玩家和教练。两者都有出生日期。

数据库

Table PL // Player    
NUMERIC plid AUTOINCREMENT

Table CO // Coach
NUMERIC coid AUTOINCREMENT

Table BASE
NUMERIC enid - playerId or coachId
CHAR    entp - 'PL' for Player, 'CO' for Coach
DATE    bdt

爪哇

Abstract BaseClass {
    Date dateOfBirth;
}

@Entity
@Table(name="PL")
Player extends BaseClass {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="plid")
    Long playerId;
}

@Entity
@Table(name="CO")
Coach extends BaseClass {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name="coid")
    Long coachId;
}

我们如何映射BaseEntity类以将表BASE中的Player.dateOfBirth保存为1, 'PL', 1970-01-01

1 个答案:

答案 0 :(得分:0)

您需要使用InheritanceType.JOINED,它允许您在基表中保留公共数据,子类可以包含特定于其需求的数据。

在您的示例中,' entp'可以充当鉴别列。您应该按如下方式注释您的类:

    @Entity
    @Inheritance(strategy=InheritanceType.JOINED)
    @DiscriminatorColumn(name="ENT_TYPE")
    @Table(name="BASE")
    public abstract class BaseClass {
          @Id
          Long id;
          @Column(name = "ENT_TYPE")
          String entp;
          ...
    }

    @Entity
    @DiscriminatorValue("PL")
    @Table(name="PL")
    public class Player extends BaseClass {

    }

    @Entity
    @DiscriminatorValue("CO")
    @Table(name="CO")
    public class Coach extends BaseClass {

    }