我正在使用 Spring Boot 2.2.6 和 JPA。我配置了两个MySQL数据源,并使用不同的数据库包进行配置。一切都很好。
现在我想在不同模式的两个表之间建立关系(@joinColumn)。所以当我这样做时,我收到未知参考实体异常。
我研究了很多地方,但没有找到在多个数据库之间建立外键关系的解决方案。
这个问题有什么解决办法吗?还是做不到..?
我也有同样的问题。终于解决了。 首先,在具有外键的模式的实体管理器中,您应该添加两个模式中的包。这样 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
之后就可以正常使用了!