JPA联合继承策略下关联子表实体时外键约束失败问题求助
我现在在使用JPA的**表每类继承(joined inheritance)**策略,保存实体的时候遇到了外键约束失败的问题,下面是详细的情况:
实体与数据库表结构说明
我定义了一个基类实体Connector,SinglePageConnector和DualPageConnector两个子类继承自它,分别存储在独立的数据库表中;另外还有一个UserConnector实体,通过connector_id字段关联Connector实体。
数据库建表SQL
基表 connector
create table connector ( id varchar(36) not null, name varchar(255) not null, login_page_url varchar(255), primary key (id) );
子表 singlepage_connector
create table singlepage_connector ( id varchar(36) not null, connector_id varchar(36) not null, primary key (id), foreign key (connector_id) references connector(id) );
子表 dualpage_connector
create table dualpage_connector ( id varchar(36) not null, connector_id varchar(36) not null, next_button_selector varchar(36), primary key (id), foreign key (connector_id) references connector(id) );
关联表 user_connector
create table user_connector ( id varchar(36) not null, user_id varchar(36) not null, connector_id varchar(36) not null, username varchar(255) not null, PRIMARY KEY (id), CONSTRAINT unique_user_connector UNIQUE (user_id, connector_id), FOREIGN KEY (connector_id) references connector (id) )
JPA实体代码
@Entity public class Connector { @OneToMany(mappedBy = "connector") private Set<UserSwaConnector> userSwaConnectors; // 其他属性、构造方法及Getter/Setter省略 } @Entity public class SinglePageConnector extends Connector { // 子类专属属性、构造方法及Getter/Setter省略 } @Entity public class DualPageConnector extends Connector { // 子类专属属性、构造方法及Getter/Setter省略 } @Entity public class UserConnector { @ManyToOne @JoinColumn(name = "connector_id", referencedColumnName = "id") private Connector connector; // 其他属性、构造方法及Getter/Setter省略 }
遇到的问题
当我尝试通过以下代码保存UserConnector实体时:
UserConnector connector = UserConnector.builder() .username(command.getConnectorUsername()) .userId(command.getUserId()) .connector(connector) .build(); userSwaConnectorRepository.save(connector);
触发了外键约束失败的错误:
Cannot add or update a child row: a foreign key constraint fails (authorization.user_connector, CONSTRAINT user_connector_ibfk_1 FOREIGN KEY (connector_id) REFERENCES connector (id))
经过排查,我发现问题出在:JPA默认会把connector_id的外键引用指向父表connector,但实际的实体数据是存储在对应的子表(singlepage_connector或dualpage_connector)中的。由于UserConnector关联的是抽象基类Connector,JPA并没有自动识别去对应的子表中查找匹配的外键记录。
我的需求
我希望JPA能够根据实际传入的实体类型,自动去对应的子表(singlepage_connector或dualpage_connector)中校验connector_id的合法性,而不是仅校验父表connector。
请问该如何配置JPA,才能正确处理这种外键关联关系,适配数据实际存储在子表的场景?
备注:内容来源于stack exchange,提问作者M Bash

