繁体   English   中英

JPA实体验证

[英]JPA Entity Validation

好的,我正在尝试在Java EE容器中设置应用程序。 我使用JPA进行持久化,我也使用javax.validation.constraints.*约束。 默认情况下,容器在@PrePersist@PreUpdate生命周期事件期间验证实体,这对我有好处,但是如何处理ConstraintViolationException

我找不到任何文档,欢迎任何建议。

好吧,你可以抓住它:)这是一个例子(来自单元测试):

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的一小部分的一个例子。

在我看来,您应该在视图级别实际处理验证。 许多演示框架支持Bean验证:JSF 2.0,Wicket,Spring MVC ......

也可以看看

你能赶上ConstraintViolationException ,如帕斯卡尔描述它,但请注意,这个异常, 随时都可能你创建/更新语句后抛出,交易结束前(见FlushModeType )。 典型的抛出点是在您创建/更新语句之后或在显式flush()语句(您应谨慎使用)时读取的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM