java - Spring JPA 抽象类行为
问题描述
我有一个问题,我做错了什么,我的实体显示不是我想要的,当我去的时候h2-console
我可以看到 3 个表格,persons
employee
manager
当我去表格时,persons
我看到所有扩展这个abstract
类的人(employee
,manager
),但是当我去其他桌子时,我只能看到id
这个类。我的问题是如何修复它,以及如何使每个表显示从开始的 id,1
因为现在员工表有 3 个 id 1,2,3
,经理表有4,5
,人员表显示正确。我想在员工表中显示 3 名员工,在经理表中显示 2 名经理,在个人表中显示每个实体,并且每个表中的 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();
}
}
解决方案
我的问题是如何解决它
绝对没有什么可以修复的,因为使用JOINED继承类型它正在执行您指定的操作,即:
- 将员工和经理共有的数据保存在人员表中。
- 将特定于员工的数据保存在员工表中。
- 将特定于管理器的数据保存在管理器表中。
https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Joined,_Multiple_Table_Inheritance
目前 Employee 和 Manager 没有定义其他字段,因此这些表中只存在 ID。
如果这不会改变,那么您最好使用带有鉴别器列的SINGLE_TABLE继承,这样所有数据都将位于 1 个表中。
最后的选择是在数据库级别根本没有任何继承,即有2 个表employees 和managers,它们定义了每种类型的所有字段。您可以使用@MappedSuperclass
它来避免在 Java 类层次结构中复制 JPA 映射的需要。
https://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Mapped_Superclasses
但请注意,使用这种方法,您不能查询所有人,而只能分别查询经理和员工。
推荐阅读
- javascript - Discord Bot 应用程序无法启动
- c# - ZXing QrCode 渲染器异常与 .Net Core 2.1
- java - 使用页眉和页脚将 HTML 转换为 PDF
- python - 如何将python列表制作成html表格
- android - 错误:任务“:app:transformClassesWithPreJackPackagedLibrariesForDebug”执行失败
- r - 当 r 中的响应为 0 或 1 时,如何计算随时间的时间变化
- firebase - Firebase - 用于帐户管理功能的不同网址
- python - 如何区分点云中的健康树点和枯木点?
- git - Git rebase - 用于解决同一文件上的合并冲突的多个 git 请求
- mysql - MySQL 5.7 中的 innodb_additional_mem_pool_size