2010-05-19 13 views
9

Parece una pregunta bastante simple, pero aún no he podido encontrar una respuesta definitiva. Tengo una clase DAO, que naturalmente está consultando la base de datos mediante el uso de consultas de criterios. Entonces, me gustaría saber si es seguro usar la misma implementación de CriteriaBuilder para la creación de diferentes consultas o si tengo que crear una nueva instancia de CriteriaBuilder para cada consulta. El siguiente ejemplo de código debe ilustrar lo que me gustaría hacer:¿Se puede usar la misma instancia de CriteriaBuilder (JPA 2) para crear múltiples consultas?

public class DAO() { 
    CriteriaBuilder cb = null; 

    public DAO() { 
     cb = getEntityManager().getCriteriaBuilder(); 
    } 

    public List<String> getNames() { 
     CriteriaQuery<String> nameSearch = cb.createQuery(String.class); 
     ... 
    } 

    public List<Address> getAddresses(String name) { 
     CriteriaQuery<Address> nameSearch = cb.createQuery(Address.class); 
     ... 
    } 
} 

¿Está bien hacer esto?

Respuesta

6

Leyendo el javadoc en la sección 3.1.1 EntityManager interfaz de la especificación JPA 2.0 (JSR 317):

/** 
* Return an instance of CriteriaBuilder for the creation of 
* CriteriaQuery objects. 
* @return CriteriaBuilder instance 
* @throws IllegalStateException if the entity manager has 
*   been closed 
*/ 
public CriteriaBuilder getCriteriaBuilder(); 

Y este comentario justo después:

El Query, TypedQuery, CriteriaBuilder, Metamodel y EntityTransaction objetos obtenidos desde un administrador de entidades son válidos mientras ese administrador de entidades está abierto.

y la sección 6.5 Criterios de construir consultas

La interfaz CriteriaBuilder es utilizado para construir CriteriaQuery objetos. El CriteriaBuilder aplicación se accede a través del método de la interfaz EntityManager o EntityManagerFactory getCriteriaBuilder.

Espero poder reutilizar un solo CriteriaBuilder para crear muchas consultas para la vida útil del administrador de entidades. Pero esa es mi interpretación. Sin embargo, mi prueba inicial parece confirmar que no hay nada de malo en eso (lo contrario sería realmente horrible).

+0

Gracias Pascal. Tu interpretación suena sólida. Esto me ayudó mucho. – pkainulainen

1

Interesante pregunta. Yo diría "por supuesto, ese es todo el punto de los criterios de búsqueda", pero no encontré una sola palabra para respaldar esto aquí: http://java.sun.com/javaee/6/docs/tutorial/doc/gjivm.html

Sin embargo, si no fueran reutilizables, eso significaría que el administrador de la entidad realmente los modifica, lo que sería un horrible diseño de API. Por lo tanto: espero que sean reutilizables, pero no puedo garantizar que

1

Esto es seguro.

Puede obtener el CriteriaBuilder desde EntityManagerFactory. En la implementación de hibernación, criteriaBuilder es un campo de instancia de EntityManagerFactory. Entonces en los casos tradicionales, no hay riesgo.

1

Eclipse Link genera errores (EclipseLink-6089, org.eclipse.persistence.exceptions.QueryException) de forma aleatoria (alguna vez funciona, en algún momento no) al iniciar una consulta, y luego otra antes de ejecutar la primera. Vea Stack Overflow y JBoss issues para más detalles.

No hay problema para reutilizar el CriteriaBuilder si ejecuta sus consultas una por una o si planea usar Hibernate.

Cuestiones relacionadas