2010-08-25 34 views
12

Estoy usando Hibernate 3.5.1 y EntityManager para la persistencia de los datos (con JPA 2.0 y EHCache 1.5). Puedo obtener la consulta mediante el siguiente código:HIbernate Entity Manager: ¿cómo almacenar en caché las consultas?

EntityManager em; 
... 
Query query = em.createQuery(...); 
... 

Ahora, el problema es que CreateQuery de EntityManager() devuelve javax.persistence.Query que, a diferencia org.hibernate.Query (devuelto por CreateQuery de la SessionFactory() método), no tiene el método org.hibernate.Query.setCacheable().

¿Cómo se supone que guarde las consultas en caché con EntityManager (u otra parte de Hibernate)?

Respuesta

24

Puede utilizar el método de desenvolver para obtener la implementación del proveedor cuando desee usar extensiones específicas del proveedor. por ejemplo,

org.hibernate.Query hquery = query.unwrap(org.hibernate.Query.class); 

Luego puede trabajar con la interfaz específica del vendedor. Alternativamente, podría desenvolver su EntityManager en un Session antes de crear la consulta.

Si no quiere tener ninguna importación de hibernación en su código, también se puede hacer

query.setHint("org.hibernate.cacheable", Boolean.TRUE); 

realmente depende de ti qué manera prefiere introducir la dependencia de proveedores.

Yo preferiría la primera, ya que fallará con una excepción si hibernate se elimina de sus dependencias enviando un gran mensaje rojo "Hola, tu desarrollador cambia esto, aquí hay una dependencia del proveedor". Mientras que la sugerencia simplemente no hace nada si el proveedor no lo entiende.

Otras personas preferirían tolerar que las cadenas mágicas dependientes del proveedor en el código sobre la necesidad de tener una dependencia de proveedor de tiempo de compilación.

+1

Gracias por los consejos. Utilizaré las "cadenas mágicas específicas del proveedor" con cadenas importadas de una clase de titular constante (como HibernateHintConstants), lo que asegurará que se genere un error de compilación si elimino Hibernate (siempre que recuerde eliminar la clase con las constantes relacionadas a sugerencias específicas de Hibernate). – eold

+4

@leden - Las cadenas ya están en org.hibernate.ejb.QueryHints, para evitar reinventar la rueda. – OrangeDog

+0

También puede agregar sugerencias en las anotaciones de @NamedQuery – OrangeDog

Cuestiones relacionadas