FK指向各种表的JPA建模

JPA modeling of FK pointing to various tables

有一个 table 带有“FK”列,其值可能指向 TableA 或 TableB,如下所示:

CREATE TABLE TableC (
  "id" bigint GENERATED BY DEFAULT AS IDENTITY,
  "linked_entity_id" integer,
  "linked_entity_type" varchar(15),
  ...other columns
  PRIMARY KEY ("id")
);

我正在努力在 JPA 中表示它。我想让 JPA 中的 TableA 和 TableB 实体都有一个列表。有办法吗?

这是我的尝试,让 TableC 实体建模如下:

@Entity
public class TableC {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private Long linkedEntityId;

    @Enumerated(EnumType.STRING)
    private LinkedEntityType linkedEntityType;

    @ManyToOne
    @JoinColumn(name = "linked_entity_id", referencedColumnName = "id", insertable=false, updateable=false)
    private TableA tableA;

    @ManyToOne
    @JoinColumn(name = "linked_entity_id", referencedColumnName = "id", insertable=false, updateable=false)
    private TableB tableB;

}

但是,当 TableC 中有一行的 linked_entity_id 列中的 id 属于 TableA id 而不是 TableB 时会发生什么情况?我认为会抛出异常。

PS: TableA 和 TableB 没有任何共同点。

您必须使用 @Where 注释:

@ManyToOne
@Where(clause = "linked_entity_type = 'TableA'")
@JoinColumn(name = "linked_entity_id", referencedColumnName = "id", insertable=false, updateable=false)
private TableA tableA;

@ManyToOne
@Where(clause = "linked_entity_type = 'TableB'")
@JoinColumn(name = "linked_entity_id", referencedColumnName = "id", insertable=false, updateable=false)
private TableB tableB;

来源:https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#pc-where