Hibernate Inheritance Mapping

假设我有3个类, Project, Module, Task。他们之间有继承关系,我想要让hibernate帮我持久化这些类。

其中,Project是父类

public class Project {
	private int projectId;
	private String projectName;}
Module 继承了Project,又有自己新的属性moduleName

public class Module extends Project{
	private String moduleName;}
Task 继承了Module, 又有自己心的属性taskName
public class Task extends Module{
	private String taskName;}
那么hibernate该怎么持久化这些对象呢?

事实上, hibernate提供了3种不同的持久化策略

1. single_class, 这也是默认的持久化策略

只建立一张表,这个表的columns是这些继承类的属性的并集U, 如果有class又衍生出了很多属性的话,是比较浪费空间的。

2. table_per_class 每个class都独立建表,这个方式比策略1更节省空间点。

3. joined 将公有的属性分离出来,分别进行存储。

举个例子:

公司午餐提供了3种套餐。

A是基础套餐

B是A + 附加小菜1

C是B + 附加小菜2

对于single_class 策略来说,就是比较土豪了,不管你点什么,所有人都送C套餐, 这样无论你选择A套餐还是B套餐我都能满足你要求吧。

对于table_per_class 策略来说,就是比较中规中矩一点了,老老实实地打包好A, B, C各种套餐,然后分发。

对于joined策略来说,是比较聪明一点了,它不是去分别准备A, B, C套餐,

而是去统计基础套餐,附加小菜1,附加小菜2的数量,分散着准备好这些,然后等配送的时候再进行打包。

下面是Project.java , Module.java, Task.java,和测试的代码。

Project.java

package com.hibernate.chapter5;

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 Project {
	private int projectId;
	private String projectName;
	
	@Id
	@GeneratedValue
	public int getProjectId() {
		return projectId;
	}
	public void setProjectId(int projectId) {
		this.projectId = projectId;
	}
	public String getProjectName() {
		return projectName;
	}
	public void setProjectName(String projectName) {
		this.projectName = projectName;
	}
}
Module.java
package com.hibernate.chapter5;

import javax.persistence.Entity;

@Entity
public class Module extends Project{
	private String moduleName;

	public String getModuleName() {
		return moduleName;
	}

	public void setModuleName(String moduleName) {
		this.moduleName = moduleName;
	}
}
Task.java
package com.hibernate.chapter5;

import javax.persistence.Entity;

@Entity
public class Task extends Module{
	private String taskName;

	public String getTaskName() {
		return taskName;
	}

	public void setTaskName(String taskName) {
		this.taskName = taskName;
	}
}
TestInheritance.java

package com.hibernate.chapter5;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class TestInheritance {

	public static void main(String[] args) {
		AnnotationConfiguration config = new AnnotationConfiguration();
		config.addAnnotatedClass(Project.class);// ask hibernate to persistent this class
		config.addAnnotatedClass(Module.class);// ask hibernate to persistent this class
		config.addAnnotatedClass(Task.class);// ask hibernate to persistent this class

		config.configure();//default will read hibernate.cfg.xml 
		new SchemaExport(config).create(true, true);//create table, first Boolean means print sql to the log file, second Boolean means execute sql
		//insert record
	
		SessionFactory factory = config.buildSessionFactory();
		Session session = factory.getCurrentSession();
		session.beginTransaction();
		
		Project project = new Project();
		project.setProjectName("pj name1");
		
		Module module = new Module();
		module.setProjectName("pj name2");
		module.setModuleName("md name2");
		
		Task task = new Task();
		task.setProjectName("pj name3");
		task.setModuleName("md name3");
		task.setTaskName("tk name3");
		
		session.save(project);
		session.save(module);
		session.save(task);
		session.getTransaction().commit();//will execute sql
	}
}

通过  @ Inheritance(strategy=InheritanceType. JOINED)可以设置不同的持久化策略,分别执行测试代码,观察生成的表和内容,可以体会到不同的策略的作用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值