У меня есть некоторые проблемы с кэшем JPA, сценарий выглядит следующим образом:JPA + CascadeType + кэш
У меня было два класса А и В с отношениями ManyToMany, но затем я разделить ManyToMany на два OneToMany отношений и новый класс
public class A{
@OneToMany(cascade = CascadeType.ALL, mappedBy="a")
private List<AB> ab;
}
public class B{
@OneToMany(cascade = CascadeType.ALL, mappedBy="b")
private List<AB> ab;
}
public class AB{
@ManyToOne
@JoinColumn(name = "A_id", referencedColumnName="id")
private A a;
@ManyToOne
@JoinColumn(name = "B_id", referencedColumnName="id")
private B b;
...other fields
}
Моя проблема заключается в том, что когда я удалить A: я хочу A и AB, чтобы удалить, и B не трогали в дБ (то же самое, если я удалить B).
Это работает, и состояние БД прекрасно, но есть проблемы с JPA и кешем. Когда я удаляю A (и AB с каскадом), кэш JPA все еще содержит ссылки на них в экземпляре B - что нежелательно. Поэтому, когда я запрашиваю B, я найду вложенные экземпляры AB, которые были удалены.
Я попытался установить каскады на AB ManyToMany, но это не поможет. Если я очистил кеш с помощью: entityManager.getEntityManagerFactory(). GetCache(). EvictAll(); все работает, но это не очень хорошее решение.
Я использую EntityManager с EJB3 и каскады от javax.persistence.
Я был бы благодарен за ответы.
Итак, вы говорите, что нет возможности сделать это с помощью каскадов или автоматически? Я ожидал, что это будет возможно, и я просто не знаю решение или правильную настройку, но если это не так, мне придется самим обрабатывать ссылки, что для меня не очень хорошая новость. – Rychu
@Rychu: Как насчет использования 'getCache(). Evict (theClass, thePrimaryKey)' вместо 'getCache(). EvictAll()'? Он должен вытеснять отдельные объекты данного типа из кеша второго уровня. – wypieprz
Конечно, лучше выселить один класс, чем весь кеш, но я хотел избежать выселения в целом. Я думаю, что мне придется вручную удалить ссылки. – Rychu