`
xiaoheliushuiya
  • 浏览: 404964 次
文章分类
社区版块
存档分类
最新评论

JPA--继承映射实战

 
阅读更多

问题背景

最近在做一个高校平台的基础模块,里面涉及到这样一个小问题:学生归属于某个学院;教师可能归属于某个学院,也可能归属于其他人事部门,如:学生处,学籍处等。怎样将这些个“机构”管理起来呢?

解决方案

方案一:

学院和人事机构单独建表,如果需要查询全部的“机构”,比如添加教师 时,需要选择其所属机构,就建立一个视图,将学院和人事机构统一起来

这种方案,需要建两个表和一个视图,太麻烦,被废了

方案二:利用继承映射

只需一张表,用一个鉴别字段来区分具体子类对象

建一个父类Institution(机构)

建两个子类CollegeAgency分别继承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语句单独查询CollegeAgency,也可以利用多态查询将所有的机构都查上来

查询学院:from College

查询人事机构:from Agency

将二者都查上来:from Institution

就这么简单,你学会了吗


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics