假设我有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)可以设置不同的持久化策略,分别执行测试代码,观察生成的表和内容,可以体会到不同的策略的作用。