Spring JPA抽象类行为

时间:2019-02-26 18:50:43

标签: java spring jpa

我有一个问题,我在做什么错,我的实体显示得不像我想要的,当我去h2-console时,我可以看到3个表格,persons employee { {1}}进入manager表时,我看到所有扩展该persons类的人(abstractemployee),但是当我进入其他表时我只能看到此类的manager。我的问题是如何解决这个问题,以及如何使每个表显示id开头的ID,因为现在employee表具有3个ID 1而Manager表具有1,2,3,人员表显示正确。我想在雇员表中显示3名雇员,在经理表中显示2名经理,在人表中显示每个实体,并且每个表中的ID都从1开始计数。

  

抽象类Person

4,5
  

Manager类扩展了Person抽象类

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "descriminatorColumn")
@Table(name = "persons")
public abstract class Person {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;

@Column(name = "first_name")
private String firstName;

@Column(name = "last_name")
private String lastName;

@Column(name = "email")
private String address;

@Column(name = "age")
private int age;

public Person(String firstName, String lastName, String address, int age) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.address = address;
    this.age = age;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

@Override
public String toString() {
    return "Person{" +
            "firstName='" + firstName + '\'' +
            ", lastName='" + lastName + '\'' +
            ", address='" + address + '\'' +
            ", age=" + age +
            '}';
  }
}
  

Employee类扩展了Person抽象类

@Entity
@Table(name = "managers")
public class Manager extends Person {

public Manager(String firstName, String lastName, String email, int age) {
    super(firstName, lastName, email, age);
}

@Override
public String toString() {
    return super.toString();
 }
}

1 个答案:

答案 0 :(得分:1)

我的问题是如何解决

绝对没有什么可修复的,因为使用 JOINED 继承类型可以完全按照您指定的方式进行操作,即:

  • 将员工和经理共同的数据保存在人员表中。
  • 将特定于员工的数据保存在employee表中。
  • 将特定于经理的数据保存在managers表中。

https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Joined,_Multiple_Table_Inheritance

当前Employee和Manager没有定义其他字段,因此这些表中仅存在ID。

如果这不会改变,那么最好使用带有区分符列的 SINGLE_TABLE 继承,以便所有数据都放在一个表中。

https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Example_single_table_inheritance_table_in_database

最后的选择是在数据库级别完全没有继承,即具有2个表employee和manager,它们定义每种类型的所有字段。您可以使用 @MappedSuperclass 来做到这一点,这样就无需在Java类层次结构中重复JPA映射。

https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Mapped_Superclasses

但是请注意,使用这种方法,您无法查询所有人,而只能分别查询经理和员工。