Fetch Lazy не работает для ManyToOne с композитным ПК - PullRequest
0 голосов
/ 29 марта 2019

У меня есть следующая структура базы данных

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 имеет составные PK и FK для A

@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 =?

FetchType.LAZY в объекте B не работает и загружается A.

Какисправить отображение для ленивой нагрузки?

1 Ответ

0 голосов
/ 29 марта 2019

Смысл отложенной загрузки заключается в том, что когда вы выбираете A, он не будет выбирать отображение один ко многим, поэтому B не будет выбираться.Вы можете использовать FetchType.EAGER для решения этой проблемы.Чтобы лучше понять разницу между типами LAZY и EAGER Fetch, посмотрите этот ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...