Fetch Lazy 不适用于具有复合 PK 的 ManyToOne

Posted

技术标签:

【中文标题】Fetch Lazy 不适用于具有复合 PK 的 ManyToOne【英文标题】:Fetch Lazy does not work for ManyToOne with composite PK 【发布时间】:2019-03-29 10:44:55 【问题描述】:

我有以下数据库结构

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。

如何修复延迟加载的映射?

【问题讨论】:

【参考方案1】:

延迟加载的要点是,当您获取 A 时,它不会获取一对多映射,因此不会获取 B。您可以使用 FetchType.EAGER 来解决这个问题。太了解 LAZY 和 EAGER Fetch 类型的区别,请看这个answer

【讨论】:

以上是关于Fetch Lazy 不适用于具有复合 PK 的 ManyToOne的主要内容,如果未能解决你的问题,请参考以下文章

JS Fetch API 不适用于具有 Authorize 属性的 ASP.NET Core 2 控制器

@Batchsize 注释不适用于 OneToMany

kotlin 的 JPA:lazy 和 @Transient 不适用于休眠

FetchType.LAZY 不适用于@OneToOne 关系

将 MyISAM 转换为 InnoDB,其中表具有两列(复合)PK,其中之一是自动增量

具有父复合 pk 的 JPA OneToMany 是子主键派生实体问题的一部分