Кэш гибернации для объекта mappedBy
У меня есть код вроде:
@Entity
@Table(name = "A")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class A
{
@OneToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER, mappedBy="a")
public B getB() {};
}
@Entity
@Table(name = "B")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class B
{
@OneToOne(cascade={}, fetch=FetchType.LAZY)
@JoinColumn(name="A_ID")
public A getA() {};
}
каждый раз, когда загружается A
, есть запрос для B
. Почему A.getB()
не кэшируется после загрузки A
и можно ли кэшировать его?
Ответы
Ответ 1
Обходной путь, который работает для меня, - это создать дополнительный метод с @OneToMany
@OneToMany(cascade={}, fetch=FetchType.EAGER, mappedBy="a")
public Set<B> getBSet() {};
@Transient
public B getB() { return b.iterator().next(); }
Я не очень доволен этими решениями, но он работает, и я не могу найти другой способ.
Ответ 2
Попробуйте добавить аннотацию @Cache к getB() getter. Мои наблюдения заключаются в том, что если вы кешируете объект, ассоциации не могут считаться кэшированными.
Ответ 3
Это может быть немного больше работы, но вы можете попробовать сделать fetchType Lazy и
сделайте выборку B явно. Таким образом, вы можете проверить, загружен ли экземпляр B или нет?
С другой стороны, вы видели этот пост? Я думаю, проблема аналогична:
https://forum.hibernate.org/viewtopic.php?p=2378461