代码之家  ›  专栏  ›  技术社区  ›  topchef

根实体及其集合的不同缓存并发策略(使用ehcache休眠)?

  •  0
  • topchef  · 技术社区  · 15 年前

    示例来自 Hibernate docs 并对其进行修改,使根级实体(客户)为只读,而其集合(票据)之一为读写:

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

    从缓存访问客户时,是否会刷新票据集合?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Pascal Thivent    15 年前

    如果您修改 tickets 给定的 Customer 在别的地方,是的。你为什么不测试这个?让我们假设 Cutomer#1 Ticket#1 Ticket#2 在其 车票 收集。我运行了以下代码:

    // 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();
    

    它显示了门票的收集得到“刷新”。