问题背景
最近在做一个高校平台的基础模块,里面涉及到这样一个小问题:学生归属于某个学院;教师可能归属于某个学院,也可能归属于其他人事部门,如:学生处,学籍处等。怎样将这些个“机构”管理起来呢?
解决方案
方案一:
学院和人事机构单独建表,如果需要查询全部的“机构”,比如添加教师 时,需要选择其所属机构,就建立一个视图,将学院和人事机构统一起来
这种方案,需要建两个表和一个视图,太麻烦,被废了
方案二:利用继承映射
只需一张表,用一个鉴别字段来区分具体子类对象
建一个父类Institution(机构)
建两个子类College和Agency分别继承Institution
子类中无需写任何java代码,只需用JPA注解指定自己的鉴别值即可
如下图:
代码如下
Institution父类
@Entity @Table(name="TB_Institution") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="type",discriminatorType=DiscriminatorType.STRING) public class Institution implements Serializable{ @Id @GeneratedValue(generator="hibernateuuidgenerator") @GenericGenerator(name="hibernateuuidgenerator",strategy="uuid") @Column(length=32,nullable=false) private String institutionId; @Column(length=50,nullable=false) private String institutionCode; @Column(length=50,nullable=false) private String institutionName; @Column(length=500,nullable=true) private String remark; @Column(nullable=false) private Date createTime=new Date(); public String getInstitutionId() { return institutionId; } public void setInstitutionId(String institutionId) { this.institutionId = institutionId; } public String getInstitutionCode() { return institutionCode; } public void setInstitutionCode(String institutionCode) { this.institutionCode = institutionCode; } public String getInstitutionName() { return institutionName; } public void setInstitutionName(String institutionName) { this.institutionName = institutionName; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } }
College子类
@Entity @DiscriminatorValue(value="c") public class College extends Institution implements Serializable { //该类中无需写任何java代码 }
Agency子类
@Entity @DiscriminatorValue(value="a") public class Agency extends Institution implements Serializable { //该类中无需写任何实际代码 }
这样既可以用HQL语句单独查询College和Agency,也可以利用多态查询将所有的机构都查上来
查询学院:from College
查询人事机构:from Agency
将二者都查上来:from Institution
就这么简单,你学会了吗