JPA通过在父类增加@Inheritance(strategy=InheritanceType.xxx)来声明继承关系。A支持3种继承策略:

  1. 单表继承(InheritanceType.SINGLETABLE),所有继承树上的类共用一张表,在父类指定(@DiscriminatorColumn)声明并在每个类指定@DiscriminatorValue来区分类型。
  2. 类表继承(InheritanceType.JOINED),父子类共同的部分公用一张表,其余部分保存到各自的表,通过join进行关联。

 

  1. 具体表继承(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;
 }

}
 
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;
 }
 

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;
 }

}
 
 
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;
 }
}
 
测试
 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);
                
 
保存后的数据库中的表记录如下:
 
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)
 
 
mysql> select * from employee_project;
+------------+-----------+
| employeeId | projectId |
+------------+-----------+
|          0 |         1 |
|          0 |         2 |
|          0 |         3 |
+------------+-----------+
3 rows in set (0.00 sec)