现在的位置: 首页 > 综合 > 正文

JPA–继承映射实战

2014年01月06日 ⁄ 综合 ⁄ 共 1954字 ⁄ 字号 评论关闭

问题背景

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

 

解决方案

方案一:

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

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

方案二:利用继承映射

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

建一个父类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

 

 

就这么简单,你学会了吗

抱歉!评论已关闭.