本文共 2547 字,大约阅读时间需要 8 分钟。
为了解决Entity类的继承与关系数据库表的对应不匹配问题,Hibernate提供了4种兼容JPA的策略,这里介绍第二种Single table。
在这种策略中,存在如下特征:
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/