java - 使用 InheritanceType.JOINED 时如何避免空子表?
问题描述
我有一个 JPA 超类和几十个子类。这些子类中的大多数都没有添加特定的属性。
使用InheritanceType.JOINED
JPA 时假定每个子类都有一个子表,从而导致大量过时的数据库表,使数据库管理和查询更加困难。
我的超类目前看起来像这样:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "type")
public abstract class Employee {
@Id public int id;
public String firstName;
public String lastName;
public Date birthday;
}
一些子类具有特定的字段:
@Entity
public class ProjectManager extends Employee {
public String project;
}
然而,大多数子类是空的:
@Entity
public class Director extends Employee {
}
@Entity
public class FacilityManager extends Employee {
}
这些数据库表是有意义的:
employee(id, first_name, last_name, birthday)
project_manager(id, project)
我怎样才能避免这些过时的表?
director(id)
facility_manager(id)
如果我不创建它们,JPA 验证将失败:
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:954) ~[hibernate-entitymanager-5.0.12.Final.jar:5.0.12.Final]
...
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [director]
at org.hibernate.tool.schema.internal.SchemaValidatorImpl.validateTable(SchemaValidatorImpl.java:67) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
...
解决方案
有一个解决方案,但仅在使用 EclipseLink 时。Hibernate 不支持这个:
混合继承
JPA 要求仅在根类中定义继承策略。如果你想混合使用 SINGLE_TABLE 和 JOINED 这可以通过在根类中使用 JOINED 继承来实现,并指定子类上的表与父类相同。
示例:将 JOINED 与混合继承一起使用
@Entity
// This subclass does not define its own table, but shares its parent's ACCOUNT table.
@Table(name="ACCOUNT")
@DiscriminatorValue("3")
public class StandardAccount extends Account {
...
}
推荐阅读
- javascript - Javascript连接传递给函数的数组数组
- c# - 如何创建可以在网站上搜索的用户控件
- java - 使用 Java MariaDB 连接器的 ConnectionException
- antd - Ant 设计中 Form.Item 的条件渲染
- laravel - 如何在 Laravel 的视图刀片中使用匿名字母表示属性
- ssh - Ansible sudo 密码丢失
- sql-server - 如何计算 Table Trade 中遗漏的零件以及存在于 Table Part 上的零件?
- svg - 给定svg中的4条曲线,得出圆的半径是否准确?
- android - Vulkan 实例
- python - 将字符串转换为 numpy 数组数组