为了账号安全,请及时绑定邮箱和手机立即绑定

Hibernate复合键和重叠字段 - 如何避免列重复

Hibernate复合键和重叠字段 - 如何避免列重复

绝地无双 2022-06-30 10:23:25
我面临一个关于如何管理特定模型的映射的问题。这是一个多租户应用程序,我们已经选择在每个实体中包含“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"))
        })


查看完整回答
反对 回复 2022-06-30
  • 1 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号