Hibernate中如何实现数据的校验?代码举例讲解

在Hibernate中,数据校验用于确保持久化的数据符合业务规则,主要有以下几种实现方式:

  1. JSR 303校验:
  • 使用@Validated注解开启校验,并在属性上使用JSR 303定义的校验注解(如@NotNull.@Size等)指定校验规则。
  • Hibernate会自动校验具有校验注解的实体对象,如果校验失败会抛出ConstraintViolationException异常。
    例如:
@Entity  
@Validated
public class Customer {
    @NotNull
    @Size(min=5, max=15)
    private String name;

    public void setName(String name) {
        this.name = name;
    }
}
  1. Check约束:
  • 在数据库表定义Check约束,规定数据必须满足的条件。
  • 当Hibernate执行INSERT或UPDATE语句传递非法数据时,数据库会抛出约束违反异常,Hibernate会封装成ConstraintViolationException抛出。
    例如:MySQL中定义:
CREATE TABLE `customer` (
  `id` int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  CONSTRAINT `chk_name` CHECK (name!='invalid name') 
) 
  1. 自定义校验:
  • 实现@org.hibernate.validator.spi.constraintdefinition.ConstraintDefinition接口,指定自定义校验规则。
  • 使用@Constraint注解引用该接口的实现类, equivalent()方法中编写校验逻辑。
  • Hibernate会自动调用我们定义的equivalent()方法进行校验,如果校验失败会抛出ConstraintViolationException异常。
    例如:
@ConstraintDefinition   
public class MyConstraint implements ConstraintDefinition<MyConstraintDef> {
    @Override
    public void validateConstraintDefinition(MyConstraintDef constraintDefinition) { ... }

    @Override
    public boolean equivalent(ConstraintDefinition<MyConstraintDef> constraint) {
        return super.equivalent(constraint);
    } 
}

@Entity
public class Customer {
    @Column(name = "name")
    @Constraint(validatedBy = MyConstraint.class)
    private String name;
}