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

本文介绍了Hibernate中处理Entity类继承的Single Table策略。在该策略中,所有继承类的属性都存入同一个数据库表,并通过DTYPE列作为区分标识。文章详细阐述了如何在父Entity类中定义discriminator属性,并探讨了其数据类型限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了解决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 { ... }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值