Можно ли использовать кеш 2-го уровня при запросе внешних ключей - PullRequest
0 голосов
/ 27 ноября 2018

afaik-объекты индексируются только по их первичному ключу в кеше 2-го уровня, поэтому запросы связанных объектов не будут использовать его:

@Entity
public class Employee {
    @Id
    @Column(name="EMP_ID")
    private long id;
    ...
    @OneToMany(mappedBy="owner")
    private List<Phone> phones;
    ...
}
@Entity
public class Phone {
    @Id
    private long id;    
    ...
    @ManyToOne
    @JoinColumn(name="OWNER_ID")
    private Employee owner;
    ...
}

EntityManager em;

// uses 2nd level cache
Employee employee = em.find(Employee.class, 1); 

// doesn't use 2nd level cache. Even if 2nd level cache actually 
// contains all referenced phones, there will be a DB call.
employee.getPhones();

Можно ли избежать вызова db при доступетелефоны и использовать кэш 2-го уровня?Существует ли реализация кэша, поддерживающая пользовательское индексирование?

В настоящее время я использую wildfly 14 с hibernate / infinispan.

Будет ли доступ к телефонам по крайней мере использовать кэш запросов или просто em.createQuery(...)?

1 Ответ

0 голосов
/ 14 декабря 2018

Я наконец нашел решение.В Hibernate есть кеш коллекции, который нужно явно включить, пометив коллекцию org.hibernate.annotations.Cache.

@Entity
@Cacheable(true)
public class Employee {
    @Id
    @Column(name="EMP_ID")
    private long id;
    ...
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    @OneToMany(mappedBy="owner")
    private List<Phone> phones;
    ...
}

Работает отлично!

...