问题描述
我必须处理规范化和架构不佳,没有遵循任何良好实践的情况,因此我需要将其与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解决方案将是创建一个具有CustomerPhone
,ProviderPhone
等独立实体的单表继承层次结构,其中type
是鉴别符列。