Как включить кеш L2 Hibernate для EAGER fetch @OneToOne дочернего объекта в объекте - PullRequest
0 голосов
/ 19 июня 2020

Я создаю систему блогов, и хотел бы предоставить для блога функцию голосования за / против. Поскольку количество голосов для блога должно быть сохранено, я решил использовать MySQL в качестве хранилища данных. И я использую Spring JPA (Hibernate) для выполнения работы ORM. Вот мои объекты данных:

class Blog{
    // ...
    @OneToOne(mappedBy = "blog", optional = false, fetch = FetchType.EAGER)
    private BlogVoteCounter voteCounter;    
}

И класс счетчика:

class BlogVoteCounter{
    @OneToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "entity_id", nullable = false, updatable = false, insertable = false)
    private Blog blog;

    private Integer count;
}

Причина, по которой я отделяю BlogVoteCounter от Blog, заключается в том, что я думаю, что поле voteCount будет изменяться с совершенно другой частотой по сравнению с другими полями Blog, так как я хочу использовать кеш для кеширования Blog, следуя этому руководству , я решил разделить их.

Однако, поскольку поле VoteCount может быть всегда необходимо при возврате объекта Blog во внешний интерфейс, и чтобы избежать проблемы n + 1, я объявил поле BlogVoteCounter в классе Blog с EAGER тип выборки.

Но, поскольку я использую кэш L2 Hibernate для кеширования объекта Blog, создание поля BlogVoteCounter в классе Blog с типом выборки EAGER всегда отключает кеш.

Итак, как мне настроить этот класс, должен ли я объявить поле voteCounter с типом выборки LAZY?

...