hibernate 5.4.12.Final "Атрибут для кэширования не определен для типа аннотации NamedQuery", не поддерживается ли cacheable = true? - PullRequest
0 голосов
/ 20 марта 2020

Я пытаюсь кэшировать исходный запрос findByName, поэтому я смотрю его только один раз во время сеанса. Однако при добавлении cacheable = true к аннотации Eclipse сообщает, что не поддерживает настройку кеширования в аннотации. Я использую Hibernate 5.4.12.Final

package aware.process.models;

import java.util.List;

import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Query;
import javax.persistence.Table;

import org.hibernate.Session;

import aware.process.HibernateUtil;
import lombok.Getter;
import lombok.Setter;

@Entity  
@Table(name= "source")  
@Cacheable  
@NamedQuery(query = "Select s from Source s where s.name = :name", name = "findSourceByName", cacheable = true)
@Getter @Setter
public class Source {

    @Id
    private String id;
    private String name;

    public static Source getByName(String parseType) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Query query = session.createNamedQuery("findSourceByName");

        query.setParameter("name", parseType);
        List<Source> sourceList = query.getResultList();

        Source source = (Source) sourceList.get(0);
        session.getTransaction().commit();
        return source;
    }
}

1 Ответ

1 голос
/ 20 марта 2020

@NamedQuery аннотация действительно не имеет атрибута cacheable. Посмотрите на javado c. Таким образом, Eclipse правильно показывает эту ошибку.

Для кэширования запроса у вас есть 2 варианта:

  1. Сделать подсказку для всех запросов, созданных из этого именованного запроса.
@NamedQuery(
    query = "Select s from Source s where s.name = :name", 
    name = "findSourceByName", 
    hints={@QueryHint(name="org.hibernate.cacheable",value="true")})           
})
Добавлять подсказки только к указанным c запросам при их создании:
Query query = session.createNamedQuery("findSourceByName");
query.setHint("org.hibernate.cacheable", true);
...