Mysql 多个表的JPA复合外键(无继承)
我必须处理一个不符合任何良好实践的规范化和模式,我需要将它与JPA集成。更改架构不是一个选项 基本上,我简化了以下模式:Mysql 多个表的JPA复合外键(无继承),mysql,jpa,spring-data-jpa,Mysql,Jpa,Spring Data 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 - Co
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
...
类型值可以是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;
...
}
到目前为止,创建一些临时字段并手动获取实体的问题已经解决,但我想以更清晰的方式重构它。如果您对所有相关实体都使用单个字段没问题,请查看 否则,您可以尝试(例如,将
@JoinColumn(name=“fk”)
和@JoinFormula(value=“'C”,referencedColumnName=“type”)
用于客户。不过,我并不完全确定@JoinFormula
是否会以这种方式工作
最后,一个普通的JPA解决方案是为CustomerPhone
、ProviderPhone
等创建一个单独的表继承层次结构,其中type
是鉴别器列