Проверка сущности JPA - PullRequest
3 голосов
/ 24 июля 2010

Хорошо, я пытаюсь настроить приложение в контейнере Java EE.Я использую JPA для постоянства, и я также использую ограничения javax.validation.constraints.*.По умолчанию контейнер проверяет сущности во время событий жизненного цикла @PrePersist и @PreUpdate, и это хорошо для меня, но как мне обработать ConstraintViolationException?

Я не могу найти на нем никаких документов, любые предложения приветствуются.

Ответы [ 2 ]

3 голосов
/ 24 июля 2010

Ну, вы можете поймать это :) Вот пример (из модульного теста):

public class CustomerTest {
    private static EntityManagerFactory emf;
    private EntityManager em;

    @BeforeClass
    public static void createEntityManagerFactory() {
        emf = Persistence.createEntityManagerFactory("MyPu");
    }

    @AfterClass
    public static void closeEntityManagerFactory() {
        emf.close();
    }

    @Before
    public void beginTransaction() {
        em = emf.createEntityManager();
        em.getTransaction().begin();
    }

    @After
    public void rollbackTransaction() {
        if (em.getTransaction().isActive()) {
            em.getTransaction().rollback();
        }
        if (em.isOpen()) {
            em.close();
        }
    }

    @Test
    public void nameTooShort() {
        try {
            Customer customer = new Customer("Bo");
            em.persist(customer);
            em.flush();
            fail("Expected ConstraintViolationException wasn't thrown.");
        } catch (ConstraintViolationException e) {
            assertEquals(1, e.getConstraintViolations().size());
            ConstraintViolation<?> violation = e.getConstraintViolations().iterator().next();

            assertEquals("name", violation.getPropertyPath().toString());
            assertEquals(Size.class, violation.getConstraintDescriptor().getAnnotation().annotationType());
        }
    }
}

Где мой клиент выглядит:

@Entity
public class Customer {
    @Id @GeneratedValue
    @NotNull
    private Long id;

    @NotNull
    @Size(min = 3, max = 80)
    private String name;

    private boolean archived;

    ...
}

Но это был всего лишь пример, демонстрирующий крошечную часть API.

По моему мнению, вы должны обработать проверку на уровне представления. Многие платформы представления поддерживают проверку бинов: JSF 2.0, Wicket, Spring MVC ...

Смотри также

0 голосов
/ 02 августа 2010

Вы можете поймать ConstraintViolationException, как это описал Pascal , но учтите, что это исключение может быть выдано в любое время после вашего оператора создания / обновления и до концатранзакции (см. FlushModeType ).Типичные точки выброса - это когда вы читаете что-то после оператора создания / обновления или в явном выражении flush() (которое следует использовать с осторожностью).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...