Можно ли использовать один и тот же экземпляр CriteriaBuilder (JPA 2) для создания нескольких запросов? - PullRequest
13 голосов
/ 19 мая 2010

Это кажется довольно простым вопросом, но мне пока не удалось найти однозначного ответа. У меня есть класс DAO, который естественно запрашивает базу данных с помощью критериальных запросов. Поэтому я хотел бы знать, безопасно ли использовать одну и ту же реализацию CriteriaBuilder для создания разных запросов или мне нужно создавать новый экземпляр CriteriaBuilder для каждого запроса. Следующий пример кода должен проиллюстрировать, что я хотел бы сделать:

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);
        ...
    }
}

Это нормально делать это?

Ответы [ 4 ]

12 голосов
/ 22 мая 2010

Чтение javadoc в разделе 3.1.1 Интерфейс EntityManager спецификации 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();

И этот комментарий сразу после:

Query, TypedQuery, CriteriaBuilder, Metamodel и EntityTransaction полученных объектов от менеджера объекта действительны в то время как этот менеджер сущностей открыт.

И раздел 6.5 Построение критериев запросов

Интерфейс CriteriaBuilder используется для строительства CriteriaQuery объекты. CriteriaBuilder реализация доступна через getCriteriaBuilder метод EntityManager или EntityManagerFactory интерфейс.

Я ожидаю, что смогу повторно использовать один CriteriaBuilder для создания множества запросов в течение всего времени существования менеджера сущностей. Но это моя интерпретация. Тем не менее, мое первоначальное тестирование, похоже, подтверждает, что в этом нет ничего плохого (наоборот, это действительно ужасно).

1 голос
/ 21 января 2012

Eclipse Link генерирует ошибки (EclipseLink-6089, org.eclipse.persistence.exceptions.QueryException) случайным образом (иногда это работает, иногда нет), когда вы запускаете запрос, затем еще один перед выполнением первого. Подробнее см. Переполнение стека и JBoss .

Нет проблем повторно использовать CriteriaBuilder, если вы выполняете свои запросы один за другим или планируете использовать Hibernate.

1 голос
/ 03 февраля 2011

Это безопасно.

Вы можете получить CriteriaBuilder из EntityManagerFactory. В реализации hibernate attributeBuilder является полем экземпляра EntityManagerFactory. Так что в традиционных случаях риска нет.

1 голос
/ 19 мая 2010

Интересный вопрос. Я бы сказал: «Конечно, в этом весь смысл критериев запросов», но я не нашел здесь ни одного слова, подтверждающего это: http://java.sun.com/javaee/6/docs/tutorial/doc/gjivm.html

Однако: если бы их нельзя было повторно использовать, это означало бы, что диспетчер сущностей фактически изменяет их, что было бы ужасным дизайном API. Итак: я надеюсь, что они могут быть использованы повторно, но я не могу гарантировать это

...