You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:01:18