多个表的JPA复合外键无继承

问题描述

我必须处理规范化和架构不佳,没有遵循任何良好实践的情况,因此我需要将其与JPA集成。更改架构不是一种选择...

基本上,我以简化的方式具有以下架构:

Table - PhoneNumber
- INT: id
- CHAR: type (C,P,S,A)
- VARCHAR: fk
...

Table - Customer
- VARCHAR: id
- VARCHAR: name
...

Table - Provider
- VARCHAR: id
- VARCHAR: name
...

Table - Contact
- INT: id
- VARCHAR: name
...

Type值可以是C,S,P或A,并且取决于此值,“ FK”列ID表示它是提供者,客户或其他实体。如果ID的类型是数字值,则将其转换为字符串。

如何创建一个看起来像这样的实体?

@Entity
public class PhoneNumber {
    @Id Integer id;
    @ManyToOne(optional = true)
    //Some way to discrimine based on TYPE column = 'C'
    Customer customer;
    @ManyToOne(optional = true)
    //Some way to discrimine based on TYPE column = 'P'
    Provider provider;
    ...
}

到目前为止,已解决了创建一些临时字段并手动获取实体的问题,但我想以更简洁的方式对其进行重构。

解决方法

如果您对所有相关实体都使用一个字段很好,请查看@Any

否则,您可以尝试使用@JoinColumnOrFormulas(例如,对于@JoinColumn(name = "fk")使用类似@JoinFormula(value = "'C'",referencedColumnName = "type")Customer的方式)。不过,并不是完全确定@JoinFormula是否会以此方式工作。

最后,一种有效的JPA解决方案将是创建一个具有CustomerPhoneProviderPhone等独立实体的单表继承层次结构,其中type是鉴别符列。