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(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(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 public class ValuedCustomer extends Customer { ... }
1 0
- Hibernate中的Entity类之间的继承关系之二SINGLE_TABLE
- Hibernate中的Entity类之间的继承关系之一MappedSuperclass
- Hibernate中的Entity类之间的继承关系之一MappedSuperclass
- Hibernate中的Entity类之间的继承关系之三JOINED
- Hibernate中的Entity类之间的继承关系之四TABLE_PER_CLASS
- hibernate继承关系的映射(single_table,class_per_table,joined)
- hibernate继承关系的映射(single_table,class_per_table,joined)
- hibernate继承关系的映射(single_table,class_per_table,joined)
- Hibernate中的Entity类之间的ManyToOne关联
- Hibernate中的Entity类之间的OneToMany关联
- Hibernate中的Entity类之间的OneToOne关联
- Hibernate中的Entity类之间的ManyToMany关联
- Hibernate的学习总结(映射类之间的继承关系)
- Hibernate 之实体类之间的关系
- 精通Hibernate之映射继承关系二
- hibernate类之间继承关系映射
- hibernate中继承映射的三种方式(SINGLE_TABLE,TABLE_PER_CLASS,JOINED)
- hibernate之继承关系
- size函数
- 将远程的git文件下载到本地
- http://www.hainiaowo.com/ask/detail-8974-1
- No Retrofit annotation found
- Ubuntu安装KVM
- Hibernate中的Entity类之间的继承关系之二SINGLE_TABLE
- windows下安装numpy,scipy遇到的问题总结
- javascript 判断数组中的重复内容的两种方法(修复BUG) by FungLeo
- CATalyst——针对末级缓存侧信道攻击的防御技术
- 面试中常见链表问题13:回文链表
- 15 个 Android 通用流行框架大全
- 链表面试题之合并有序的两个线性表-递归和非递归的方法
- 将List中的对象按对象某一属性的大小来排序
- serverlet 分文件处理