博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate中的Entity类之间的继承关系之二SINGLE_TABLE
阅读量:4179 次
发布时间:2019-05-26

本文共 2547 字,大约阅读时间需要 8 分钟。

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

转载地址:http://hnlai.baihongyu.com/

你可能感兴趣的文章
Observer模式
查看>>
高性能服务器设计
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>
Pentaho 开发: 在eclipse中构建Pentaho BI Server工程
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
java多线程中的join方法详解
查看>>
在C++中如何实现模板函数的外部调用
查看>>
HTML5学习之——HTML 5 应用程序缓存
查看>>
HTML5学习之——HTML5 内联 SVG
查看>>
HTML5学习之——HTML 5 服务器发送事件
查看>>
SVG学习之——HTML 页面中的 SVG
查看>>
SVG 形状学习之——SVG圆形
查看>>
SVG 滤镜学习之——SVG 滤镜
查看>>