下面描述来自:http://www.cnblogs.com/holbrook/archive/2012/12/30/2839842.html
JPA通过在父类增加@Inheritance(strategy=InheritanceType.xxx)来声明继承关系。A支持3种继承策略:
- 单表继承(InheritanceType.SINGLETABLE),所有继承树上的类共用一张表,在父类指定(@DiscriminatorColumn)声明并在每个类指定@DiscriminatorValue来区分类型。
- 类表继承(InheritanceType.JOINED),父子类共同的部分公用一张表,其余部分保存到各自的表,通过join进行关联。
- 具体表继承(InheritanceType.TABLEPERCLASS),每个具体类映射到自己的表。
下面是例子:
package com.demo.beans;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
@Entity
@EntityListeners(MyMonitor.class)
public class Employee {
@Id
private int employeeId;
private String employeeName;
@ElementCollection
private Set<String> nickName;
@OneToMany(mappedBy="employee", cascade=CascadeType.ALL)
private List<Phone> phones;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(
joinColumns={@JoinColumn(name="employeeId")},
inverseJoinColumns={@JoinColumn(name="projectId")}
)
private List<Project> projects;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="AddressId")
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Set<String> getNickName() {
return nickName;
}
public void setNickName(Set<String> nickName) {
this.nickName = nickName;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public List<Project> getProjects() {
return projects;
}
public void setProjects(List<Project> projects) {
this.projects = projects;
}
public List getPhones() {
return phones;
}
public void setPhones(List phones) {
this.phones = phones;
}
}
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
@Entity
@EntityListeners(MyMonitor.class)
public class Employee {
@Id
private int employeeId;
private String employeeName;
@ElementCollection
private Set<String> nickName;
@OneToMany(mappedBy="employee", cascade=CascadeType.ALL)
private List<Phone> phones;
public int getEmployeeId() {
return employeeId;
}
public void setEmployeeId(int employeeId) {
this.employeeId = employeeId;
}
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(
joinColumns={@JoinColumn(name="employeeId")},
inverseJoinColumns={@JoinColumn(name="projectId")}
)
private List<Project> projects;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="AddressId")
private Address address;
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public Set<String> getNickName() {
return nickName;
}
public void setNickName(Set<String> nickName) {
this.nickName = nickName;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public List<Project> getProjects() {
return projects;
}
public void setProjects(List<Project> projects) {
this.projects = projects;
}
public List getPhones() {
return phones;
}
public void setPhones(List phones) {
this.phones = phones;
}
}
package com.demo.beans;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.ManyToMany;
@Entity(name="Project")
@Inheritance(strategy=InheritanceType.JOINED) ----关联类型
@DiscriminatorColumn(name="ProjectType")
@DiscriminatorValue(value="Proj")
public class Project {
@Id
private int projectId;
private String projectName;
@ManyToMany(mappedBy="projects",cascade=CascadeType.ALL)
private List<Employee> employees;
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;
}
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.ManyToMany;
@Entity(name="Project")
@Inheritance(strategy=InheritanceType.JOINED) ----关联类型
@DiscriminatorColumn(name="ProjectType")
@DiscriminatorValue(value="Proj")
public class Project {
@Id
private int projectId;
private String projectName;
@ManyToMany(mappedBy="projects",cascade=CascadeType.ALL)
private List<Employee> employees;
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;
}
public List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
package com.demo.beans;
import java.math.BigDecimal;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue(value="LocProj")
public class LocalProject extends Project {
private BigDecimal projectBudget;
public BigDecimal getProjectBudget() {
return projectBudget;
}
public void setProjectBudget(BigDecimal projectBudget) {
this.projectBudget = projectBudget;
}
}
import java.math.BigDecimal;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue(value="LocProj")
public class LocalProject extends Project {
private BigDecimal projectBudget;
public BigDecimal getProjectBudget() {
return projectBudget;
}
public void setProjectBudget(BigDecimal projectBudget) {
this.projectBudget = projectBudget;
}
}
package com.demo.beans;
import java.math.BigDecimal;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue(value="GlobProj")
public class GlobalProject extends Project {
private String projectCountry;
private BigDecimal projectBudget;
public String getProjectCountry() {
return projectCountry;
}
public void setProjectCountry(String projectCountry) {
this.projectCountry = projectCountry;
}
public BigDecimal getProjectBudget() {
return projectBudget;
}
public void setProjectBudget(BigDecimal projectBudget) {
this.projectBudget = projectBudget;
}
}
import java.math.BigDecimal;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
@Entity
@DiscriminatorValue(value="GlobProj")
public class GlobalProject extends Project {
private String projectCountry;
private BigDecimal projectBudget;
public String getProjectCountry() {
return projectCountry;
}
public void setProjectCountry(String projectCountry) {
this.projectCountry = projectCountry;
}
public BigDecimal getProjectBudget() {
return projectBudget;
}
public void setProjectBudget(BigDecimal projectBudget) {
this.projectBudget = projectBudget;
}
}
测试
Project project = new Project();
project.setProjectId(1);
project.setProjectName("Project");
// Create a Global Project
GlobalProject globalProject = new GlobalProject();
globalProject.setProjectId(2);
globalProject.setProjectName("Global Project");
globalProject.setProjectCountry("Brazil");
globalProject.setProjectBudget(new BigDecimal(150000));
// Create a Local Project
LocalProject localProject = new LocalProject();
localProject.setProjectId(3);
localProject.setProjectName("Local Project");
localProject.setProjectBudget(new BigDecimal(50000));
// Create a list of projects
List<Project> projects = new ArrayList<Project>();
// add the project into the list
projects.add(project);
projects.add(globalProject);
projects.add(localProject);
Employee employee = new Employee();
employee.setEmployeeName("Test Bai");
// Set the project into employee
employee.setProjects(projects);
userRepository.addEmployee(employee);
project.setProjectId(1);
project.setProjectName("Project");
// Create a Global Project
GlobalProject globalProject = new GlobalProject();
globalProject.setProjectId(2);
globalProject.setProjectName("Global Project");
globalProject.setProjectCountry("Brazil");
globalProject.setProjectBudget(new BigDecimal(150000));
// Create a Local Project
LocalProject localProject = new LocalProject();
localProject.setProjectId(3);
localProject.setProjectName("Local Project");
localProject.setProjectBudget(new BigDecimal(50000));
// Create a list of projects
List<Project> projects = new ArrayList<Project>();
// add the project into the list
projects.add(project);
projects.add(globalProject);
projects.add(localProject);
Employee employee = new Employee();
employee.setEmployeeName("Test Bai");
// Set the project into employee
employee.setProjects(projects);
userRepository.addEmployee(employee);
保存后的数据库中的表记录如下:
mysql> select * from project;
+-------------+-----------+----------------+
| ProjectType | projectId | projectName |
+-------------+-----------+----------------+
| Proj | 1 | Project |
| GlobProj | 2 | Global Project |
| LocProj | 3 | Local Project |
+-------------+-----------+----------------+
3 rows in set (0.00 sec)
mysql> select * from localproject;
+---------------+-----------+
| projectBudget | projectId |
+---------------+-----------+
| 50000.00 | 3 |
+---------------+-----------+
1 row in set (0.00 sec)
mysql> select * from globalproject;
+---------------+----------------+-----------+
| projectBudget | projectCountry | projectId |
+---------------+----------------+-----------+
| 150000.00 | Brazil | 2 |
+---------------+----------------+-----------+
1 row in set (0.00 sec)
mysql> select * from employee;
+------------+--------------+-----------+
| employeeId | employeeName | AddressId |
+------------+--------------+-----------+
| 0 | Test Bai | NULL |
+------------+--------------+-----------+
1 row in set (0.00 sec)
+-------------+-----------+----------------+
| ProjectType | projectId | projectName |
+-------------+-----------+----------------+
| Proj | 1 | Project |
| GlobProj | 2 | Global Project |
| LocProj | 3 | Local Project |
+-------------+-----------+----------------+
3 rows in set (0.00 sec)
mysql> select * from localproject;
+---------------+-----------+
| projectBudget | projectId |
+---------------+-----------+
| 50000.00 | 3 |
+---------------+-----------+
1 row in set (0.00 sec)
mysql> select * from globalproject;
+---------------+----------------+-----------+
| projectBudget | projectCountry | projectId |
+---------------+----------------+-----------+
| 150000.00 | Brazil | 2 |
+---------------+----------------+-----------+
1 row in set (0.00 sec)
mysql> select * from employee;
+------------+--------------+-----------+
| employeeId | employeeName | AddressId |
+------------+--------------+-----------+
| 0 | Test Bai | NULL |
+------------+--------------+-----------+
1 row in set (0.00 sec)
mysql> select * from employee_project;
+------------+-----------+
| employeeId | projectId |
+------------+-----------+
| 0 | 1 |
| 0 | 2 |
| 0 | 3 |
+------------+-----------+
3 rows in set (0.00 sec)
+------------+-----------+
| employeeId | projectId |
+------------+-----------+
| 0 | 1 |
| 0 | 2 |
| 0 | 3 |
+------------+-----------+
3 rows in set (0.00 sec)