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

我面临一个关于如何管理特定模型的映射的问题。


这是一个多租户应用程序,我们已经选择在每个实体中包含“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


多年来一直没有修复...所以,我的问题是:您是否遇到过这样的映射,当我有一个与主键共享字段的外键时,是否有避免重复列的解决方案?


绝地无双
浏览 148回答 1
1回答

子衿沉夜

如此处所述,您可以通过对列 id_tenant 使用 @JoinColumnOrFormula 来绕过验证。您应该像这样映射作者的关联:    @JoinColumnsOrFormulas(         value = {                 @JoinColumnOrFormula(column = @JoinColumn(referencedColumnName = "id", name = "author_id")),                 @JoinColumnOrFormula(formula = @JoinFormula(referencedColumnName = "tenant_id", value = "tenant_id"))         })
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java