如何在JavaSE中激活自动JPA实体验证?

如何在JavaSE中激活自动JPA实体验证?,java,hibernate,validation,jpa,hibernate-validator,Java,Hibernate,Validation,Jpa,Hibernate Validator,我在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/persi

我在
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>
并坚持下去

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();
为什么
entityManager.merge(entity0);entityManager.flush()不会导致在
entity0.setProperty0(null)之后自动调用的验证器的验证约束冲突?Afaik,类路径上的验证实现支持JPA实体验证

Hibernate作为JPA和Hibernate验证器是示例实现。我假设所有JPA提供者和JSR303实现都有一个解决方案

我知道我可以手动验证实体,这超出了问题的范围

在以下位置提供SSCCE。它包含的信息不比上面的MCVE多,只允许尽可能轻松地在本地重现问题。

我需要添加

<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>

javax.el
javax.el-api
3.0.0
org.glassfish.web
javax.el
2.2.6
添加到依赖项列表

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();
<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>