Hibernate中的Entity类之间的继承关系之二SINGLE_TABLE

来源:互联网 发布:linux内核经典书籍 编辑:程序博客网 时间:2024/06/05 20:02

为了解决Entity类的继承与关系数据库表的对应不匹配问题,Hibernate提供了4种兼容JPA的策略,这里介绍第二种Single table。

在这种策略中,存在如下特征:

  • 数据库中只有一个表,其中包含了继承相关的所有父子Entity类的属性
  • 父Entity中有一个特殊的属性作为区分标识

1.Single table策略的实现

父Entity类定义如下:

@Entity(name = "Account")@javax.persistence.Inheritance(strategy = InheritanceType.SINGLE_TABLE)public static class Account {    @Id    private Long id;    private String owner;    private BigDecimal balance;    private BigDecimal interestRate;    public Long getId() {        return id;    }    public void setId(Long id) {        this.id = id;    }    public String getOwner() {        return owner;    }    public void setOwner(String owner) {        this.owner = owner;    }    public BigDecimal getBalance() {        return balance;    }    public void setBalance(BigDecimal balance) {        this.balance = balance;    }    public BigDecimal getInterestRate() {        return interestRate;    }    public void setInterestRate(BigDecimal interestRate) {        this.interestRate = interestRate;    }}


子Entity类定义如下:

@Entity(name = "DebitAccount")public static class DebitAccount extends Account {    private BigDecimal overdraftFee;    public BigDecimal getOverdraftFee() {        return overdraftFee;    }    public void setOverdraftFee(BigDecimal overdraftFee) {        this.overdraftFee = overdraftFee;    }}


另一个子Entity类定义如下:

@Entity(name = "CreditAccount")public static class CreditAccount extends Account {    private BigDecimal creditLimit;    public BigDecimal getCreditLimit() {        return creditLimit;    }    public void setCreditLimit(BigDecimal creditLimit) {        this.creditLimit = creditLimit;    }}


数据库表结构如下:

CREATE TABLE Account (    DTYPE VARCHAR(31) NOT NULL ,    id BIGINT NOT NULL ,    balance NUMERIC(19, 2) ,    interestRate NUMERIC(19, 2) ,    owner VARCHAR(255) ,    overdraftFee NUMERIC(19, 2) ,    creditLimit NUMERIC(19, 2) ,    PRIMARY KEY ( id ))

在该表中,DTYPE列默认作为区分两种实体的标识(discriminator)。在父Entity类中没有说明任何discriminator属性时,数据库中,默认的discriminator列名为DTYPE,数据类型为String。


2.父Entity类中的discriminator属性

也可以在父Entity类中声明discriminator属性,以区分子实体。

这需要借助于JPA的@javax.persistence.DiscriminatorColumn标注,其中又可以通过属性给出数据类型。在JPA 2.1中,可以作为discriminator的列必须具有如下类型:

  • STRING
  • CHAR
  • INTEGER

不过,Hibernate中可以作为discriminator的列必须具有如下类型:

  • String
  • char
  • int
  • byte
  • short
  • boolean

父Entity类中定义discriminator属性的示例如下:

     @Entity     @Table(name="CUST")     @Inheritance(strategy=SINGLE_TABLE)     @DiscriminatorColumn(name="DISC", discriminatorType=STRING, length=20)     public class Customer { ... }


Entity类中定义不变:

     @Entity     public class ValuedCustomer extends Customer { ... }

1 0
原创粉丝点击