我在persistence.xml
中激活了实体验证
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="de.richtercloud_hibernate-automatic-validation_jar_1.0-SNAPSHOTPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<validation-mode>AUTO</validation-mode>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:myDB;create=true"/>
<property name="javax.persistence.jdbc.user" value="app"/>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="javax.persistence.jdbc.password" value="app"/>
<property name="javax.persistence.schema-generation.database.action" value="create"/>
</properties>
</persistence-unit>
</persistence>
并声明了Maven依赖项
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.3.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.11.Final</version>
</dependency>
<dependency>
<groupId>org.apache.derby</groupId>
<artifactId>derby</artifactId>
<version>10.14.2.0</version>
</dependency>
假设我有一个非常简单的
@Entity
public class Entity0 implements Serializable {
@Id
private Long id;
@Basic
@NotNull
private String property0;
public Entity0() {
}
public Entity0(Long id,
String property0) {
this.id = id;
this.property0 = property0;
}
[getter and setter for id and property0]
}
并持久化
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("de.richtercloud_hibernate-automatic-validation_jar_1.0-SNAPSHOTPU");
EntityManager entityManager = entityManagerFactory.createEntityManager();
Entity0 entity0 = new Entity0(1l, "abc");
entityManager.getTransaction().begin();
entityManager.persist(entity0);
entityManager.flush();
entityManager.getTransaction().commit();
entityManager.close();
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
entity0 = entityManager.merge(entity0);
entity0.setProperty0(null);
entityManager.merge(entity0);
entityManager.flush();
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
为什么在entity0.setProperty0(null);
之后,entityManager.merge(entity0); entityManager.flush();
不会导致自动调用的验证器违反验证约束?Afaik,类路径上的验证实现启用了JPA实体验证。
Hibernate as JPA和Hibernate Validator都是示例实现。我假设有一个适用于所有JPA提供者和JSR303实现的解决方案。
我知道我可以手动验证实体,这超出了问题的范围。
https://gitlab.com/krichter/hibernate-automatic-validation提供了一个SSCCE。它不包含比上面的MCVE更多的信息,并且只允许尽可能容易地在本地重现问题。
发布于 2018-08-09 04:08:25
我需要添加
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.el</artifactId>
<version>2.2.6</version>
</dependency>
添加到依赖项列表中。
https://stackoverflow.com/questions/51753637
复制相似问题