hibernate - Fetch Lazy 不适用于具有复合 PK 的 ManyToOne
问题描述
我有以下数据库结构
CREATE TABLE a (
id TEXT PRIMARY KEY,
creation_date TIMESTAMP WITH TIME ZONE NOT NULL
);
CREATE TABLE b (
id text
a_id TEXT REFERENCES a,
active BOOLEAN NOT NULL,
creation_date TIMESTAMP WITH TIME ZONE NOT NULL,
modification_date TIMESTAMP WITH TIME ZONE NOT NULL,
version INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (id, a_id)
);
CREATE UNIQUE INDEX ON b (a_id) WHERE (active);
CREATE UNIQUE INDEX ON b (id) WHERE (active);
和 JPA 实体,其中 B 具有 A 的复合 PK 和 FK
@Entity
@Table (name = "a")
class A (
@Id
var id: String
)
@Entity
@Table (name = "b")
class B (
@EmbeddedId
@AttributeOverride (name = "aId", column = Column (name = "a_id", updatable = false))
var pk: Pk,
var active: Boolean
) {
@JoinColumn (name = "a_id")
@MapsId ("aId")
@ManyToOne (cascade = [CascadeType.ALL], fetch = FetchType.LAZY)
var a: A? = null
@Embeddable
class Pk (
var id: String,
var aId: String?
): Serializable {
override fun equals (other: Any?): Boolean {
...
}
override fun hashCode (): int {
...
}
}
}
存储库
interface BRepository: JpaRepository <B, B.Pk>
当我打电话时
bRepository.findById (B.Pk ("b_id", "a_id"))
然后两个请求出现在休眠日志中
Hibernate: select b0_.a_id as a_id1_1_0_, b0_.id as id2_1_0_, b0_.active as active3_1_0_, b0_.creation_date as creation4_1_0_, b0_.modification_date as modifica5_1_0, your own; and b0_.id =?
Hibernate: select a0_.id as id1_0_0_, a0_.creation_date as creation2_0_0_ from a a__ where a0_.id =?
B 实体中的 FetchType.LAZY 不起作用并加载了 A。
如何修复延迟加载的映射?
解决方案
延迟加载的要点是,当您获取 A 时,它不会获取一对多映射,因此不会获取 B。您可以使用 FetchType.EAGER 来解决这个问题。太了解 LAZY 和 EAGER Fetch 类型之间的区别,请看这个答案
推荐阅读
- javascript - 如何将资源从 php 传递到 javascript
- erlang - 如何检查 ETS Erlang/Elixir 中是否存在命名表
- postgresql - Keycloak 不在 Docker 中的 PostgreSQL 中保存数据
- arrays - 将对象数组转换为数组数组
- spring-mvc - 对网络托管 CPanel 感到困惑
- json - 无法解析通用 Codable
- python - 如何让 PyCharm 分析器只显示我的源代码的时间,而不是任何库?
- javascript - 节点错误“无法读取未定义的属性 'insertId'”
- laravel - 如何从 Vue 组件访问值?
- c# - 无法模拟已经存在的电子邮件功能 - Selenium