Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 多个表的JPA复合外键(无继承)_Mysql_Jpa_Spring Data Jpa - Fatal编程技术网

Mysql 多个表的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

我必须处理一个不符合任何良好实践的规范化和模式,我需要将它与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
...
类型值可以是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
是鉴别器列