使用Hibernate的JPA未执行Bean Validation问题排查
问题:Hibernate事务提交时未自动校验@NotNull约束
期望Hibernate在提交事务时自动校验@NotNull约束,手动校验能检测到约束违规,但事务提交时却忽略了Bean Validation,怀疑是依赖版本组合问题,但不确定。
主类代码
package sageniuz; import org.hibernate.validator.messageinterpolation.ParameterMessageInterpolator; import sageniuz.model.Message; import javax.persistence.Persistence; import javax.validation.Validation; public class App { public static void main(String[] args) { var emFactory = Persistence.createEntityManagerFactory("helloworld"); var em = emFactory.createEntityManager(); em.getTransaction().begin(); var msg = new Message(null); var validator = Validation.byDefaultProvider() .configure() .messageInterpolator(new ParameterMessageInterpolator()) .buildValidatorFactory() .getValidator(); var violations = validator.validate(msg); System.out.println("====> " + violations); // 此处能显示约束违规 em.persist(msg); em.getTransaction().commit(); // 此处忽略Bean Validation em.close(); emFactory.close(); } }
Entity代码
package sageniuz.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.validation.constraints.NotNull; import java.util.Objects; @Entity public class Message { @Id @GeneratedValue private Long id; @NotNull private String text; protected Message() { } public Message(String text) { this.text = text; } public void setText(String text) { this.text = text; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || !Objects.equals(getClass(), o.getClass())) { return false; } Message message = (Message) o; return Objects.equals(id, message.id) && Objects.equals(text, message.text); } @Override public int hashCode() { return Objects.hash(id, text); } @Override public String toString() { return "Message{" + "id=" + id + ", text='" + text + '\'' + '}'; } }
Persistence Unit配置
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="helloworld"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <class>sageniuz.model.Message</class> <properties> <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/> <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5433/postgres?currentSchema=java_persistence"/> <property name="javax.persistence.jdbc.user" value="postgres"/> <property name="javax.persistence.jdbc.password" value="mysecret"/> <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL10Dialect"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.hbm2ddl.auto" value="create"/> </properties> </persistence-unit> </persistence>
Gradle构建文件
plugins { id 'java' } repositories { mavenCentral() } dependencies { implementation 'org.hibernate:hibernate-entitymanager:5.6.14.Final' implementation 'org.hibernate:hibernate-validator:6.2.5.Final' runtimeOnly 'org.postgresql:postgresql:42.5.0' }
内容的提问来源于stack exchange,提问作者Claus Polanka
相关产品推荐
相关产品推荐

