我面临一个关于如何管理特定模型的映射的问题。这是一个多租户应用程序,我们已经选择在每个实体中包含“tenant_id”,因此我们不必每次需要获取实体时都进行联合(实际上,这是我的问题的根源...)。模型如下:+--------------------+ +---------------+| Book | | Author |+--------------------+ +---------------+| id (pk) | | id (pk) || tenant_id (pk)(fk) | | tenant_id (pk || author_id (fk) | | name || title | +---------------++--------------------+如您所见,tenant-id 在每个实体中,并且是主键的一部分。我们使用@IdClass 来管理复合键。这是代码: @Data public class TenantAwareKey implements Serializable { private UUID id; private Integer tenantId; } @IdClass(TenantAwareKey.class) @Entity @Table(name = "BOOK") @Data public class Book { @Id @GeneratedValue @Column(name = "ID") private UUID id; @Id @Column(name = "TENANT_ID") private Integer tenantId; private String title; @ManyToOne @JoinColumns( value = { @JoinColumn(referencedColumnName = "id", name = "author_id"), @JoinColumn(referencedColumnName = "tenant_id", name = "tenant_id", insertable = false, updatable = false) }) private Author author; } @IdClass(TenantAwareKey.class) @Entity @Data public class Author { @Id @GeneratedValue @Column(name = TenantAwareConstant.ENTITY_ID_COLUMN_NAME) private UUID id; @Id @Column(name = TenantAwareConstant.TENANT_ID_COLUMN_NAME) private Integer tenantId; private String name; }如果我不尝试“共同化”tenant_id 列,我设法使其工作,当我只有一个具有此tenant_id 的外键时可以接受,但随着外键数量的增加越来越少,导致添加每次都有一个tenant_id 列,重复信息和破坏记忆......经过一番挖掘,我在 Hibernate 中发现了一个未解决的问题:https ://hibernate.atlassian.net/browse/HHH-6221多年来一直没有修复...所以,我的问题是:您是否遇到过这样的映射,当我有一个与主键共享字段的外键时,是否有避免重复列的解决方案?
1 回答

子衿沉夜
TA贡献1828条经验 获得超3个赞
如此处所述,您可以通过对列 id_tenant 使用 @JoinColumnOrFormula 来绕过验证。
您应该像这样映射作者的关联:
@JoinColumnsOrFormulas( value = { @JoinColumnOrFormula(column = @JoinColumn(referencedColumnName = "id", name = "author_id")), @JoinColumnOrFormula(formula = @JoinFormula(referencedColumnName = "tenant_id", value = "tenant_id")) })
添加回答
举报
0/150
提交
取消