如何在 Spring JPA/Hibernate 中不同方案的两个表之间建立外键关系

问题描述 投票:0回答:1

我正在使用 Spring Boot 2.2.6 和 JPA。我配置了两个MySQL数据源,并使用不同的数据库包进行配置。一切都很好。

现在我想在不同模式的两个表之间建立关系(@joinColumn)。所以当我这样做时,我收到未知参考实体异常

我研究了很多地方,但没有找到在多个数据库之间建立外键关系的解决方案。

这个问题有什么解决办法吗?还是做不到..?

java hibernate jpa spring-data-jpa
1个回答
0
投票

我也有同样的问题。终于解决了。 首先,在具有外键的模式的实体管理器中,您应该添加两个模式中的包。这样 Hibernate 也知道引用的表。示例:

val em = builder
            .dataSource(dataSource1)
            .packages(
                "some.package.schema1",
                "some.package.schema2"
            )
            .persistenceUnit("unit1")
            .build()

就我而言,我需要它来建立多对一关系。我在实体中的外键如下所示:

@JoinColumn(name = "other_entity_id", referencedColumnName = "id")
@ManyToOne
val otherEntity: OtherEntity

name 和referencedColumnName 应与表定义中的名称匹配,外键应如下所示:

FOREIGN KEY (other_entity_id) REFERENCES schema2.OtherEntity (id)

两个 SQL 列应该具有相同的类型(在我的例子中是 BIGINT)。 OtherEntity 中的键具有注释 @Id 和 @GenerateValue(strategy = GenerationType.IDENTITY)。最后,当 Hibernate 仅使用默认模式(示例中的 schema1)生成查询时,我遇到了问题。为了让 Hibernate 知道每个表应该使用哪个模式,您应该将此信息添加到每个实体的 @Table 注释中:

@Entity
@Table(name = "OtherEntity", schema = "schema2", catalog = "schema2")
data class OtherEntity( ... )

最初我只有 schema 参数中的 schema,后来我发现从 Hibernate 5 开始,在创建实体类时使用目录而不是 schema 来定义 schema。感谢这个答案:https://stackoverflow.com/a/63561868/13158298

之后就可以正常使用了!

© www.soinside.com 2019 - 2024. All rights reserved.