Я пытаюсь включить кэш второго уровня Hibernate, но не могу избежать нескольких запросов на отношения OneToOne.
Мои модели:
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Business {
@OneToOne(mappedBy = "business", cascade = {CascadeType.REMOVE}, fetch = FetchType.EAGER)
private Address address;
}
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Address {
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "business_id", unique = true, nullable = false, foreignKey = @ForeignKey(name = "fk_business_id"))
private Business business;
}
Когда я запускаю session.get(Business.class, id)
с Business
с идентификатором id
в кеше, запрос на загрузку Business
не выдается, но это относится к Address
.
Я понимаю, что Address является владельцем отношения и что в записи кэша Business Address.id
информации нет, но разве нельзя было бы решить эту проблему, применяя тот же механизм, что и отношения * ToMany, создавая новую область кэша для каждого поля? Если предположить, что Business 1 связан с Address 2, в моем кеше после первой загрузки будут следующие регионы и записи:
Business
Business#1 -> [business model]
Business.address
Business.address#1 -> [2]
Address
Address#2 -> [address model]
Я попытался заставить его работать, пометив Address.business
с помощью @NaturalId
и Address
класс с @NaturalIdCache
. Регион кэша создан и заполнен, но session.get(Business.class, id)
не использует его.
Моя модель Business
имеет еще много связей OneToOne, внешний ключ которых находится на другой стороне (не в Business), и мы должны перечислить несколько в то же время сервер базы данных должен обрабатывать десятки запросов на HTTP-запрос.
Я прочитал Руководство пользователя Hibernate, объяснение Влада Михалча о 2L C и его обезвоженный формат в памяти, объяснение Баэльдуна и несколько других ответов StackOverflow и не могут найти способ решить эту проблему.