Hibernate Entity继承关系inheritance(Annotation版本)

继承是java的三大特性之一,这是众所周知的。在真实的开发环境中也运用的很多,比如说BaseDao,BaseAction。但是本文所要讨论的并不是这些,而是关于Entity的继承。就目前自己接触到的项目而言,Entity使用继承的比较少。但是在hibernate中,提供了关于Entity继承的内容,本文就简单的介绍一下。
Java代码侧,继承唯一的实现手段是使用关键字extends,而且不能多继承。在数据库一侧实现继承的话,实现继承的表结构有多种,Hibernate介绍了三种,分别是SINGLE_TABLE,TABLE_PER_CLASS,JOINED.这里介绍SINGLE_TABLE,JOINED。
现有三个类:Person(id,name),Student(id,name,score),Teacher(id,name,title)
在Java侧,Student和Teacher都从Person继承。
数据库侧
1.SINGLE_TABLE(单一表)用一张表来描述着三个Entity,那么就需要使用一个Flag Column 来区分该条记录是People,Student,Teacher。建好的表结构如下P_S_T(id,name,score,title,flg)。
flag=0,Person类,score和title字段都没有数据;
flag=1,Student类,score字段有数据,title字段没数据;
flag=2,Teacher类,score字段没数据,title字段有数据。
SINGLE_TABLE 方式Annotation实现
Person Entity

package com.bjsxt.hibernate;

import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

/**
*@Inheritance指定继承策略
*@DiscriminatorColumn 标志字段定义
*@DiscriminatorValue ,当数据为Person类时候,flg=0
*/
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="flg", discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("0")
public class Person {
    private int id;
    private String name;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

Student Entity

package com.bjsxt.hibernate;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

/**
**@DiscriminatorValue ,当数据为Student类时候,flg=1
*/
@Entity
@DiscriminatorValue("1")
public class Student extends Person {

    private int score;

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

}

Teacher Entity

package com.bjsxt.hibernate;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

/**
**@DiscriminatorValue ,当数据为Teacher类时候,flg=2
*/
@Entity
@DiscriminatorValue("2")
public class Teacher extends Person {
    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }


}
  1. JOINED 使用外键连接的方式实现继承
    三张表分别如下
    Person(id,name);
    Student(id,score),id 参照Person的id
    Teacher(id,title),id 参照Person的id。

JOINED 方式Annotation实现
Person Entity

package com.bjsxt.hibernate;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy=InheritanceType.JOINED)

public class Person {
    private int id;
    private String name;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

}

Student Entity

package com.bjsxt.hibernate;

import javax.persistence.Entity;

@Entity
public class Student extends Person {

    private int score;

    public int getScore() {
        return score;
    } //Person p = Person(load(1));

    public void setScore(int score) {
        this.score = score;
    }

}

Teacher Entity

package com.bjsxt.hibernate;

import javax.persistence.Entity;

@Entity
public class Teacher extends Person {
    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }


}

以上是SINGLE_TABLE和JOINED的使用。
二者的比较:SINGLE_TABLE 只有一张表很方便,但是可能会造成大量的数据冗余,很多字段都是空的。JOINED方式虽然表多,但是逻辑是很清楚的。关于二者的使用,具体情况具体分析。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate 实体类中常用的注解如下: 1. @Entity:表明该类是一个实体类,用于与数据库中的表相映射。 2. @Table:用于指定实体类与数据库中哪张表相映射。 3. @Id:用于指定实体类中的主键属性。 4. @GeneratedValue:用于指定主键生成策略,常用的生成策略有 AUTO、IDENTITY、SEQUENCE 和 TABLE。 5. @Column:用于指定实体类属性与数据库表中哪个列相映射。 6. @Transient:用于标注实体类中不需要持久化到数据库中的属性。 7. @Temporal:用于指定实体类属性与数据库表中的日期时间类型相映射。 8. @OneToMany:用于指定实体类之间的一对多关系。 9. @ManyToOne:用于指定实体类之间的多对一关系。 10. @ManyToMany:用于指定实体类之间的多对多关系。 11. @JoinTable:用于指定多对多关系中的关联表。 12. @JoinColumn:用于指定实体类之间的关联属性。 13. @OrderBy:用于指定查询结果集的排序方式。 14. @NamedQuery:用于定义命名查询。 15. @NamedNativeQuery:用于定义本地 SQL 命名查询。 16. @NamedStoredProcedureQuery:用于定义存储过程命名查询。 17. @SqlResultSetMapping:用于定义查询结果集与实体类之间的映射关系。 18. @Version:用于指定实体类中的乐观锁版本属性。 以上是 Hibernate 实体类中常用的注解,不同的注解在实体类中的作用也不同。需要根据具体的业务需求来选择合适的注解进行使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值