策略1:One table per subclass
java 代码 (超类)
- @Entity
- @Table(name="tb_person")
- @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
- public class Person implements Serializable{
- Integer id;
- @Id
- @Column(name="id")
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- }
java 代码 (子类1)
- @Entity
- @Table(name="tb_individual")
- public class Individual extends Person {
- String firstName;
- String lastName;
- @Column(name="firstname")
- public String getFirstName() {
- return firstName;
- }
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
- @Column(name="lastname")
- public String getLastName() {
- return lastName;
- }
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
- }
java 代码 (子类2)
- @Entity
- @Table(name="tb_corporation")
- public class Corporation extends Person{
- String registerationNumber;
- String name;
- @Column(name="name")
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Column(name="registeration_number")
- public String getRegisterationNumber() {
- return registerationNumber;
- }
- public void setRegisterationNumber(String registerationNumber) {
- this.registerationNumber = registerationNumber;
- }
- }
从结构上来看这是一种依赖性比较强的数据库结构,3张表之间本身是独立的。而它们之间的关系却需要手动维护。
java 代码
- From Person
这条查询语句返回的结果是3张表的集合 Person+Individual+Corporation。 但是值得商榷的是这个query语句会查询3个数据库,效率问题会是以后一个比较明显的问题。
java 代码
- From Corporation
这条查询语句返回的结果就是1张表的内容 Corporation
策略2: Single table per class hierarchy
java 代码
- @Entity
- @Table(name="tb_right")
- @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
- @DiscriminatorColumn(name="RIGHT_TYPE"
- ,discriminatorType=DiscriminatorType.STRING)
- @DiscriminatorValue("RIGHT_SUPER")
- public class Right {
- Integer id;
- String name;
- @Column(name="right_id")
- @GeneratedValue
- @Id
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- @Column(name="right_name")
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
java 代码
- @Entity
- @Table(name="tb_right")
- @DiscriminatorValue("LEASE_SUB")
- public class Lease extends Right {
- String leaseName;
- @Column(name="lease_name")
- public String getLeaseName() {
- return leaseName;
- }
- public void setLeaseName(String leaseName) {
- this.leaseName = leaseName;
- }
- }
java 代码
- @Entity
- @Table(name="tb_right")
- @DiscriminatorValue("PROPERTY_SUB")
- public class Property extends Right {
- String name;
- @Column(name="property_name")
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
这种结构把一个继承树全部移植到一张表内,通过一个字段来标识。相对而言,任何填加,修改,删除的操作都针对于一张表而言,在速度上有一定的优势,但是由于通过一个字段来体现多态,结构局限性比较大。而且维护的成本也比较高!违反了OO的高内聚,低偶合的原则。
java 代码
- From Right
查询出来的结果是表tb_right的全部内容!
java 代码
- From Lease
查询出来的结果是表tb_right中字段right_type为Lease_sub的所有字段!
java 代码
- From Property
查询出来的结果是表tb_right中字段right_type为Property_sub的所有字段!
策略3:字段共享策略
java 代码
- @Entity
- @Inheritance(strategy=InheritanceType.JOINED)
- @Table(name="tb_estate")
- public class Estate implements Serializable{
- Integer id;
- String description;
- @Column(name="description")
- public String getDescription() {
- return description;
- }
- public void setDescription(String description) {
- this.description = description;
- }
- @Id
- @GeneratedValue
- @Column(name="id")
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- }
java 代码
- @Entity
- @Table(name="tb_build")
- @PrimaryKeyJoinColumn(name="id")
- public class Building extends Estate {
- String address;
- @Column(name="address")
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- }
java 代码
- @Entity
- @Table(name="tb_land")
- @PrimaryKeyJoinColumn(name="id")
- public class Land extends Estate {
- String landName;
- @Column(name="land_name")
- public String getLandName() {
- return landName;
- }
- public void setLandName(String landName) {
- this.landName = landName;
- }
- }