gpt4 book ai didi

java - JPA 实体验证

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:03:34 25 4
gpt4 key购买 nike

好的,我正在尝试在 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 一小部分的示例。

在我看来,您实际上应该在 View 级别处理验证。许多表示框架都支持 Bean Validation:JSF 2.0、Wicket、Spring MVC...

另见

关于java - JPA 实体验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3323111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com