2014-02-12 3 views
0

У меня есть некоторые проблемы с кэшем 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.

Я был бы благодарен за ответы.

ответ

0

Ваша проблема аналогична eclipselink 2 OneToMany with one association table how to delete from one side. Таким образом, перед удалением A (и, следовательно, удалением AB) удалите все ссылки от B до AB.

+0

Итак, вы говорите, что нет возможности сделать это с помощью каскадов или автоматически? Я ожидал, что это будет возможно, и я просто не знаю решение или правильную настройку, но если это не так, мне придется самим обрабатывать ссылки, что для меня не очень хорошая новость. – Rychu

+0

@Rychu: Как насчет использования 'getCache(). Evict (theClass, thePrimaryKey)' вместо 'getCache(). EvictAll()'? Он должен вытеснять отдельные объекты данного типа из кеша второго уровня. – wypieprz

+0

Конечно, лучше выселить один класс, чем весь кеш, но я хотел избежать выселения в целом. Я думаю, что мне придется вручную удалить ссылки. – Rychu

Смежные вопросы