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

Java Hibernate复合键和重叠字段-如何避免列重复,java,hibernate,multi-tenant,composite-key,Java,Hibernate,Multi Tenant,Composite Key,我面临一个关于如何管理特定模型的映射的问题 这是一个多租户应用程序,我们已经选择在每个实体中包含“租户id”,因此我们不必在每次需要获取实体时都进行联合(事实上,这是我的问题的根源…) 模型如下: +--------------------+ +---------------+ | Book | | Author | +--------------------+ +---------------+ | id (pk) |

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

这是一个多租户应用程序,我们已经选择在每个实体中包含“租户id”,因此我们不必在每次需要获取实体时都进行联合(事实上,这是我的问题的根源…)

模型如下:

+--------------------+   +---------------+
|        Book        |   |    Author     |
+--------------------+   +---------------+
| id (pk)            |   | id (pk)       |
| tenant_id (pk)(fk) |   | tenant_id (pk |
| author_id (fk)     |   | name          |
| title              |   +---------------+
+--------------------+
如您所见,租户id位于每个实体中,并且是主键的一部分。我们使用@IdClass来管理复合密钥。代码如下:


@资料
公共类TenantAwareKey实现可序列化{
私有UUID;
私人整数租户;
}

@IdClass(tenatawarekey.class)
@实体
@表(name=“BOOK”)
@资料
公共课堂用书{
@身份证
@生成值
@列(name=“ID”)
私有UUID;
@身份证
@列(name=“租户ID”)
私人整数租户;
私有字符串标题;
@许多酮
@连接柱(
值={
@JoinColumn(referencedColumnName=“id”,name=“author\u id”),
@JoinColumn(referencedColumnName=“tenant\u id”,name=“tenant\u id”,insertable=false,updateable=false)
})
私人作者;
}

@IdClass(tenatawarekey.class)
@实体
@资料
公共类作者{
@身份证
@生成值
@列(名称=TenantAwareConstant.ENTITY\u ID\u列\u名称)
私有UUID;
@身份证
@列(名称=TenantAwareConstant.TENANT\u ID\u列\u名称)
私人整数租户;
私有字符串名称;
}
然后,在运行我的应用程序时,我得到了:


    Caused by: org.hibernate.AnnotationException: Mixing insertable and non insertable columns in a property is not allowed: 
    com.pharmagest.durnal.tenant.entity.BookNoDuplicateColumn.author
        at org.hibernate.cfg.Ejb3Column.checkPropertyConsistency(Ejb3Column.java:725)
        at org.hibernate.cfg.AnnotationBinder.bindManyToOne(AnnotationBinder.java:3084)
    (...)

如果我不尝试“共同化”tenant_id列,我会设法让它工作,当我只有一个具有此tenant_id的外键时,这是可以接受的,但随着外键数量的增加,外键会越来越少,导致每次添加一个tenant_id列,复制信息并破坏内存

挖掘了一点之后,我发现Hibernate中存在一个未解决的问题:

它已经多年没有被修复了。。。因此,我的问题是:您是否遇到过这样的映射,当我有一个外键与主键共享一个字段时,是否有一种解决方案来避免重复的列?

如前所述,您可以通过使用列id的@JoinColumnOrFormula绕过验证

您应该像这样映射作者的关联:

    @JoinColumnsOrFormulas(
        value = {
                @JoinColumnOrFormula(column = @JoinColumn(referencedColumnName = "id", name = "author_id")),
                @JoinColumnOrFormula(formula = @JoinFormula(referencedColumnName = "tenant_id", value = "tenant_id"))
        })

搜索如何使用@EmbeddedId注释,您需要为IdAt创建单独的实体类。首先,我考虑使用
@EmbeddedId
,但它有一个限制,因为我的主键是
@GeneratedValue
,这是不可能的,正如您在本期中看到的:谢谢,这正是我需要的!