Я создаю систему блогов, и хотел бы предоставить для блога функцию голосования за / против. Поскольку количество голосов для блога должно быть сохранено, я решил использовать 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
?