在Hibernate中,数据校验用于确保持久化的数据符合业务规则,主要有以下几种实现方式:
- 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;
}
}
- 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')
)
- 自定义校验:
- 实现@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;
}