Используются ли утверждения Java для проверки реализации JPA - PullRequest
0 голосов
/ 23 марта 2012

Я работаю над приложением с (почти) ванильным стеком Java EE 6 (EJB, JPA, JSF и т. Д.). Мы размещаем наше приложение на Glassfish 3, и наш код, связанный с постоянством, на данный момент является на 100% чистым JPA.

К сожалению, одна часть нашего приложения должна использовать хранимую процедуру в базе данных Oracle 10g. Чтобы вызвать эту хранимую процедуру, мы решили использовать EclipseLink (реализация JPA, поставляемая в комплекте с Glassfish).

Поскольку (небольшая) часть нашего кода теперь зависит от EclipseLink, я задумался, как проверить эту зависимость. Зависимость не поставляется вместе с приложением, но предполагается, что она доступна на нашей платформе развертывания (например, Glassfish).

На мой взгляд, у нас есть следующие варианты:

  1. Ничего не делай, просто дай этому потерпеть неудачу. Я думаю, что это решение является неоптимальным, так как никогда не указывается, что наш код предполагает наличие EclipseLink.
  2. Проверьте EclipseLink в операторе if и сгенерируйте конкретное исключение.

    if (!JpaHelper.isEclipseLink(entityManager)) {
        throw new InvalidJpaImplementationException();
    }
    
  3. Добавить утверждение, которое проверяет EclipseLink, и разрешать ему генерировать исключение в случае сбоя.

    assert JpaHelper.isEclipseLink(entityManager)) : "Blah!";
    

Будет ли утверждение (вариант 3) правильным решением? Вы бы предпочли другое решение? Какой и почему?

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Поскольку вы используете JPA, я бы не стал делать конкретную реализацию EclipseLink (так как должна соответствовать спецификации JPA). Не важно, какие провайдеры JPA используют.

Ваш код может сломаться, если вы решите перейти (скажем, в Hibernate) (если вы реализуете проверку зависимостей). Вся цель спецификации JPA состоит в том, что разработчик никогда не должен беспокоиться о продукте поставщика реализации.


Если вы хотите использовать хранимую процедуру Eclipse Link, то я бы предложил вам создать механизм, который будет вызывать хранимую процедуру, независимо от EntityManager. Таким образом, он все равно не будет беспокоиться о зависимости поставщика реализации JPA. Пример вызова StoredProcedure с помощью Hibernate JPA можно найти здесь .

0 голосов
/ 23 марта 2012

Утверждения могут быть отключены, что приведет к поломке вашего кода при ошибке. Поэтому официально лучше не утверждать. Если в будущем другой менеджер сущностей будет удален, вам все равно лучше удалить тест, а не отключать assert. Причина: вам повезло, что другой JPA использовал другую реализацию. Возможно, ведение журнала только для InvalidJpaImplementationException также проще.

...