Подтвердить что ты не робот

Кэш гибернации для объекта 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 и можно ли кэшировать его?

4b9b3361

Ответ 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