java - 子类可以与超类具有相同的列名吗?
问题描述
我已经使用继承映射创建了数据库表。我希望所有表都有审计列。
这是代码:
- 一个抽象的 Auditable 类
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable {
@CreatedDate
private LocalDateTime createdAt;
@CreatedBy
private String createdBy;
}
- 一个人类:
@Entity
@Table(name = "person")
@Inheritance(strategy = InheritanceType.JOINED)
public class Person extends Auditable {
private String name;
}
- 学生班:
@Entity
@PrimaryKeyJoinColumn(name = "person_id")
public class Student extends Person {
private int grade;
}
- 和一个员工类:
@Entity
@PrimaryKeyJoinColumn(name = "person_id")
public class Staff extends Person {
private int salary;
}
我的问题是只生成了表的created_at
和,但表的和为空。created_by
Person
created_at
created_by
Staff
Student
是否也可以生成created_at
and表?created_by
Staff
Student
解决方案
您遇到麻烦的原因是因为这是一对一的关联,而不是继承。
此映射不起作用,因为当您使用继承时,您声明 aStudent
是 a Person
,因此,您创建学生的那一刻就是创建一个人的那一刻。因此,没有理由在表中重复这两个列。
而且,您正在使用InheritanceType.JOINED
,基本上要求不在表之间共享公共列。
这种映射有意义的唯一方法是这些列是否代表不同的创建时间。例如,一个人何时出生,何时成为学生。如果是这种情况,您可以使用此映射:
@Entity
@PrimaryKeyJoinColumn(name = "person_id")
public static class Student extends Person {
int grade;
@Column(name = "createdAt")
LocalDateTime studentCreatedAt;
@Column(name = "createdBy")
String studentCreatedBy;
}
@Entity
@PrimaryKeyJoinColumn(name = "person_id")
public static class Staff extends Person {
int salary;
@Column(name = "createdAt")
LocalDateTime staffCreatedAt;
@Column(name = "createdBy")
String staffCreatedBy;
}
如果不是这种情况,则Person
不是 and 的超类,Student
您Staff
可以使用此映射表示您的数据库:
@Entity
public class Person extends Auditable {
@Id
Long id;
String name;
}
@Entity
public class Student extends Auditable {
@Id
Long id;
int grade;
@MapsId
@OneToOne
Person person;
}
@Entity
public class Staff extends Auditable {
@Id
Long id;
int salary;
@MapsId
@OneToOne
Person person;
}
Where@MapsId
告诉 Hibernate ORM 该列person_id
也是该表的键。因此你不需要@PrimaryKeyJoinColumn(name = "person_id")
.
推荐阅读
- google-cloud-platform - 如何知道我在 GCP 中拥有的所有权限?
- node.js - 如何更改 api 响应
- cors - Google Cloud IAP CORS 政策阻止我的网络应用调用受 IAP 保护的 API
- javascript - Bitrix24 BX24.callBatch js 语法
- c# - Context.update() 无法跟踪实体类型“模型”的实例,因为已在跟踪另一个具有键值“{Id: 12}”的实例
- regex - 从文件中搜索和替换多行
- java - Flutter中移动应用主屏幕的小部件
- django - 如何在 django 上检索使用 google 登录的用户的照片个人资料 url
- flutter - 如何在 dart 的 GET-request 中使用 queryParamets 将参数放入 url?
- blockchain - 无法从另一台机器连接到 Geth 节点 RPC