Различные стратегии одновременного кэширования для корневого объекта и его коллекции (Hibernate с EHCache)? - PullRequest
0 голосов
/ 30 апреля 2010

Приведенный пример из Документы Hibernate и его изменение таким образом, что сущность корневого уровня (Клиент) доступна только для чтения, а одна из ее коллекций (заявок) доступна для чтения-записи:

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class Customer { 
    ... 
    @OneToMany(...)
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    public SortedSet<Ticket> getTickets() {
        return tickets;
    }
    ...
}

Будет ли обновляться коллекция билетов при обращении к клиенту из кэша?

1 Ответ

1 голос
/ 30 апреля 2010

Если вы измените один из tickets данного Customer где-то еще, да. Почему бы тебе не проверить это? Давайте предположим, что Cutomer#1 имеет Ticket#1 и Ticket#2 в своей коллекции tickets. Я запустил этот код:

// loading in first session
Session session1 = HibernateUtil.getSession();
Transaction tx1 = session1.beginTransaction();
Customer c1 = (Customer) session1.load(Customer.class, 1L); // loads from db and puts in cache
for (Ticket ticket : c1.getTickets()) { // caches q2742145.Customer.tickets#1
    System.out.println(ticket);
}
Ticket ticket = (Ticket) session1.load(Ticket.class, 1L); // doesn't hit the db
ticket.setName("foo"); // do some change on Ticket#1
session1.save(ticket);
tx1.commit(); // Ticket#1 gets updated in the db and the cached association invalidated

// loading in second session
Session session2 = HibernateUtil.getSession();
Transaction tx2 = session2.beginTransaction();
Customer c2 = (Customer) session2.load(Customer.class, 1L); // hits the cache
Set<Ticket> tickets = c2.getTickets();
for (Ticket ticket2 : tickets) { // reloads tickets from db
    System.out.println(ticket2); 
}
tx2.commit();

Который показывает, что коллекция билетов обновляется.

...