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;
有一个 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;