Hibernate кеш для объекта mappedBy - PullRequest
13 голосов
/ 20 мая 2011

У меня есть такой код:

@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 и возможно ли его кешировать?

Ответы [ 3 ]

2 голосов
/ 22 мая 2011

Обходной путь, который работает для меня, - это создать дополнительный метод с @ OneToMany

@OneToMany(cascade={}, fetch=FetchType.EAGER, mappedBy="a")
public Set<B> getBSet() {};

@Transient
public B getB() { return b.iterator().next(); }

Я не очень доволен этим решением, но оно работает, и я не могу найти другой путь.

0 голосов
/ 28 декабря 2011

Это может быть немного больше работы, но вы можете попробовать сделать fetchType Lazy и явно выполнить выборку B.Таким образом, вы можете проверить, был ли экземпляр B уже загружен или нет?

Заметим ли вы этот пост?Я думаю, что проблема похожа:

https://forum.hibernate.org/viewtopic.php?p=2378461

0 голосов
/ 22 мая 2011

Попробуйте также разместить аннотацию @Cache на getB () getter.По моим наблюдениям, если вы кешируете объект, его ассоциации могут не считаться кешированными.

...