Spring JPA抽象类行为

问题描述 投票:0回答:1

我有疑问,我做错了什么,我的实体显示不像我想要的,当我去h2-console我可以看到3张桌子,当我去persons桌子时employee manager persons我看到所有延伸这个abstract的人上课(employeemanager),但是当我去其他桌子时,我只能看到这类课程的id。我的问题是如何修复它,以及如何使每个表显示从1盯着的id,因为现在employee表有3个id 1,2,3,而manager表有4,5,person表格显示正确。我想在employee表中显示3个雇员,在managers表中显示2个经理,在people表中显示每个实体,并且每个表中的ID都显示为1。

抽象类人

@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 +
            '}';
  }
}

Manager类扩展了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();
 }
}

Employee类扩展了Person抽象类

@Entity
@Table(name = "employees")
public class Employee extends Person {

public Employee(String firstName, String lastName, String address, int age) {
    super(firstName, lastName, address, age);
}

@Override
public String toString() {
    return super.toString();
  }
}
java spring jpa
1个回答
2
投票

我的问题是如何解决它

绝对没有什么可以解决的,因为使用JOINED继承类型它完全按照您指定的方式执行,即:

  • 将人员和经理共同的数据保存在人员表中。
  • 保存employees表中特定于员工的数据。
  • 在manager表中保存特定于管理器的数据。

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

目前,Employee和Manager不定义其他字段,因此这些表中只存在ID。

如果不改变那么你可能最好使用带有鉴别器列的SINGLE_TABLE继承,这样所有数据都将在1个表中。

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

最后的选择是在数据库级别根本不具有任何继承,即有2个表雇员和经理,它们定义每种类型的所有字段。您可以使用@MappedSuperclass来执行此操作,这样可以避免在Java类层次结构中复制JPA映射。

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

但要注意这种方法,你无法查询所有人,只能分别为经理和员工查询。

© www.soinside.com 2019 - 2024. All rights reserved.