Кэширование спящего объекта с использованием естественного идентификатора - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть примечание о сущности, к которому добавлено поле «код» в словаре.Я хотел бы получить все заметки, но есть проблема с n + 1.Когда я выбираю заметки в спящем режиме, а также извлекаю данные из таблицы Dicionary, один дополнительный запрос на одну заметку (если словарь отсутствует в кеше первого уровня).

Я включил кэш 2-го уровня (я использую ehcache), который работает только тогда, когда я получаю словари по идентификатору, может быть, есть способ, как использовать естественный идентификатор?Я не хочу использовать кеш запросов.Может мне стоит загрузить словари из кеша второго уровня в кеш первого уровня?

@Entity
public class Note {

    @Id
    private Long id;

    @ManyToOne
    @JoinColumn(referencedColumnName = "code")
    private Dictionary noteType;
}


@Entity
@NaturalIdCache
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Dictionary {

    @Id
    private Long id;

    @NaturalId
    @Column(unique = true, nullable = false, updatable = false, insertable = false)
    private String code;
}


@org.springframework.stereotype.Repository
public interface NoteRepository extends Repository<Note, Long> {
    List<Note> findAll();
}


@RestController
@RequiredArgsConstructor
class NoteController {

    private final NoteRepository noteRepository;

    @GetMapping("\all")
    public List<Note> getAll() {
        return noteRepository.findAll();
    }
}

Надеюсь, это достаточно ясно.Спасибо.

1 Ответ

0 голосов
/ 04 июня 2019

Согласно 13.2.При настройке отображений кэша второго уровня необходимо использовать @javax.persistence.Cacheable на Dictionary:

Объекты не кэшируются, если они явно не помечены как кэшируемые (с аннотацией @Cacheable).

Согласно 13.4.Кэш сущностей :

Кэш второго уровня Hibernate также может загружать сущности по их естественному идентификатору

this.em.unwrap(Session.class)
    .bySimpleNaturalId(AppConfig.class)
    .load(appConfigEnum.getValue());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...