第一章:hibernate validate入门
1:搭建
1.1:下载架包4.0.2版本的架包。为什么使用该版本,在hibernate validate项目应用中进行说明。
1.2:解压下载的压缩包,导入hibernate-validator和validation-api架包
1.3:这里面既包含了javax下的约束也包含了org.hibernate 下的约束,在之前的版本中,javax下的约束hibernate是不认的。
2:一个简单的例子
public class Car {
@NotNull(message = "manufacturer not null")
private String manufacturer;
@Min(2)
private int seatCount;
………get,set……
}
public class CarTest {
private static Validator validator;
@BeforeClass
public static void setUp() {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
validator = factory.getValidator();
}
@Test
public void manufactureIsNull() {
Car car = new Car(null, 5);
//1:validate()对一个给定的实体对象中定义的所有约束进行校验
Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car);
Assert.assertEquals(1, constraintViolations.size());
}
}
3:常用的约束种类
A:字段级的约束:
当约束被定义在字段上的时候, 这个字段的值是通过字段访问策略来获取并验证的. 也就是说Bean Validation的实现者会直接访问这个实例变量而不会调用属性的访问器(getter) 即使这个方法存在。静态字段或者属性是不会被校验的
@Min(2)
private int seatCount;
B:属性级的约束
必须遵守JavaBeans规范,且定义在getter上,不能定义在setter上
@NotNull
public String getManufacturer() {
return manufacturer;
}
C:类级的约束
@LeaveHourCheck
@LeaveDateBeforeCheck
public class HrLeave extends FlowBusdocument implements java.io.Serializable {
}
D:约束的继承
不仅会验证RentalCar中的约束,同时会验证Car中的约束
public class RentalCar extends Car {
@NotNull
private String rentalStation;
}
E:对象图
在验证当前对象约束的情况下,也会同时验证driver对象的约束
@Valid
private Person driver;
4:约束的校验
Validator是校验的主要接口,有3个方法能够用来校验整个实体对象或者对象的属性,3个方法都返回Set<ConstraintViolation>
对象,
可以通过如下方法获取实例对象
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
校验方法
1:validate
使用validate()
方法对一个给定的实体对象中定义的所有约束条件进行校验
Car car = new Car(null, false, 5);
//1:validate()对一个给定的实体对象中定义的所有约束进行校验
Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car);
2:validateProperty
通过validateProperty()
可以对一个给定实体对象的单个属性进行校验,需要符合JavaBean命名规范
Car car = new Car(null, false, 5);
Set<ConstraintViolation<Car>> constraintViolations = validator.validateProperty(car, "manufacturer");
3:validateValue
通过validateValue() 方法,你能够校验如果把一个特定的值赋给一个类的某一个属性的话,是否会违反此类中定义的约束条件.
Car car = new Car(null, false, 5);
Set<ConstraintViolation<Car>> constraintViolations = validator.validateValue(Car.class, "manufacturer", null);
约束提示信息
可以直接通过message=”提示信息”;也可以通过message提供模板,具体的错误信息在ValidationMessages.properties(src目录下)中定义
public class Car {
//验证不通过时,message提供一个模板
@Min(value=2,message="{com.pps.annotation.bean.Car.seatCount}")
private int seatCount;
……………………get,set…………………………
}
ValidationMessages.properties中模板的配置
#value是Min注解中value的值 如果是@Length(min=1,max=3),则写成{min},{max}
com.pps.annotation.bean.Car.seatCount=座位数不能少于{value}
@Test
public void manufactureIsNull() {
Car car = new Car(“TEST”, true, 1);
for (ConstraintViolation<Car> constraintViolation : constraintViolations) {
System.out.println(constraintViolation.getMessage());
}
Assert.assertEquals(1, constraintViolations.size());
}
输出:座位数不能少于2
5:校验组
在校验的时候,可以选择应用那些约束条件。
eg:一个员工类可能有20个字段,针对不同的操作可能需要验证的约束也不同。添加的时候可能需要验证姓名,密码,地址,电话,性别…..;登录的时候只需要验证姓名,密码。这时候可以通过添加组,来进行验证
一个校验组序列中包含的校验组和这个校验组序列不能造成直接或者间接的循环引用. 包括校验组继承. 如果造成了循环引用的话, 会导致GroupDefinitionException异常.
1:添加约束时,指定所属的组
@NotNull(message = "{com.pps.annotation.bean.Car.manufacturer}")
private String manufacturer;
@AssertTrue(groups=CarChecks.class)
private boolean passedVehicleInspection;
@AssertTrue(groups=CarChecks.class)
private boolean isRegistered;
@Min(value=2,message="{com.pps.annotation.bean.Car.seatCount}",groups=SeatGroup.class)
private int seatCount;
2:组只是一个标识,是一个接口,同时可以继承其他的组
public interface CarChecks {}
3:验证组下面的约束
Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car); //验证default组下的约束
Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car, CarChecks.class);
Set<ConstraintViolation<Car>> constraintViolations = validator.validate(car, SeatGroup.class, Default.class);
5:内置约束
Bean Validator
@Null
@NotNull
@Size
@Min
@Max
@AssertTrue
@AssertFalse
@DecimalMax
@DecimalMin
@Digits
@Future
@Past
@Pattern
@Valid
Hibernate Validator
@CreditCardNumber
@Email
@Length
@NotBlank
@NotEmpty
@Range
@SafeHtml
@ScriptAssert
@URL
6:自定义约束(hibernate validate中,4.0和3.6创建方式不同)
创建自己的约束规则一般需要3步:创建约束的标注,实现一个验证器,定义默认的验证错误信息
A:创建约束标注
//该注解可以应用在:方法,域,注解类型上
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE})
//注解在运行期通过反射读取
@Retention(RetentionPolicy.RUNTIME)
//注解使用的约束类
@Constraint(validatedBy=CheckCaseValidator.class)
//在生成JavaDoc时,该注解会被添加到java文档中
@Documented
public @interface CheckCase {
//定义错误消息,可以直接使用错误提示内容,也可以使用模板
String message() default "{com.pps.myannotation.CheckCase.message}";
//定义所在的组
Class<?>[] groups() default {};
//定义级别条件的严重级别
Class<? extends Payload>[] payload() default {};
int value();
}
B:实现验证器
public class IntMinValidator implements ConstraintValidator<CheckCase, Integer> {
private IntMin min;
@Override
public void initialize(CheckCase arg0) {
this.min = arg0;
}
/**
* arg0:用户输入的内容
*/
@Override
public boolean isValid(Integer arg0, ConstraintValidatorContext arg1) {
boolean flag = true;
if (arg0.compareTo(min.value()) < 0) {
flag = false;
}
//可以重新定义模板
/*if (!flag) {
arg1.disableDefaultConstraintViolation();
arg1.buildConstraintViolationWithTemplate(
"{com.pps.myannotation.CheckCaseValidator.message}")
.addConstraintViolation();
}*/
return flag;
}
}
C:自定义约束的使用
@CheckCase(value=5)
private int seat;
分享到:
相关推荐
在Spring MVC框架中整合Hibernate的校验机制,可以极大地提高我们开发Web应用的效率和代码质量。这主要是通过使用Hibernate Validator来实现数据的验证,它...这是一项基础但重要的技术,值得每个Java Web开发者掌握。
### hibernate验证框架学习 #### 一、简介与入门 **Hibernate Validator** 是一个流行的 Java 验证框架,它实现了 **JSR 349**(即 Java Bean Validation API)规范,提供了强大的验证功能,帮助开发者确保应用...
设置为`update`则会在已有表基础上更新结构,而`validate`则只会验证表结构是否与实体类匹配。 4. **SessionFactory和Session**: - `SessionFactory`是Hibernate的核心,它是线程安全的,一个应用只需要一个...
使用hibernate-validator 进行校验的jar包,里面包括了基础hibernate-validator-5.0.0.CR2.jar hibernate-validator-annotation-processor-5.0.0.CR2.jar 之外,还包括了el-api-2.2.jar javax.el-2.2.4等项目必不可...
这些是 Hibernate 学习的基础内容,对于初学者来说,理解这些概念和配置至关重要。随着深入学习,还将涉及到查询、事务处理、缓存策略、性能优化等方面的知识。在实践中,结合实际项目需求,逐步掌握 Hibernate 的...
Hibernate 3 在其先前版本的基础上增加了对JPA(Java Persistence API)的支持,优化了性能,并提供了更丰富的查询语言(HQL)。在这个项目中,Hibernate 负责将Java对象映射到数据库表,执行CRUD(Create, Read, ...
本文将深入探讨Hibernate配置文件,这是使用Hibernate进行数据库操作的基础。 标题"hibernate--5.Hibernate配置文件详解-2"暗示我们将继续上一节的内容,进一步深入理解Hibernate配置文件的各个方面。通常,...
Hibernate是Java领域中一款广泛应用的关系对象映射框架,它极大地简化了数据库操作。"Hibernate四大属性"是指在配置Hibernate时...通过掌握这些基础属性,开发者能够更好地驾驭Hibernate,实现高效、可靠的数据库操作。
本篇文章将从基础概念、安装配置、实体类定义、配置文件详解、CRUD操作等方面详细介绍Hibernate的入门知识。 ### 一、Hibernate概述 Hibernate 是基于Java的持久层框架,它通过映射Java对象到关系数据库表,简化了...
例如,`create`会根据实体类自动创建数据库表,`update`则会在已有表的基础上更新结构,而`validate`只会验证数据库结构是否与实体类匹配,不进行任何修改。 6. **数据库连接**:Hibernate需要数据库连接才能执行...
### Hibernate介绍与动手入门体验 #### 一、Hibernate概述 Hibernate是一种开源的对象关系映射(ORM)框架,用于简化Java应用程序中的数据持久化操作。它允许开发者以面向对象的方式处理数据库,而不需要直接编写...
- **hibernate.hbm2ddl.auto**: 自动管理数据库模式的策略,如`create`(每次启动时创建新表)、`update`(更新现有表结构)、`validate`(验证模式是否匹配,不作任何修改)等。 ### 3. 示例配置 以MySQL为例,一...
Strut+Spring+Hibernate框架的工作原理 Strut+Spring+Hibernate框架是当前流行的Java EE框架,它们之间的结合使用可以提供一个完整的企业级应用程序解决方案。下面我们将详细介绍Strut、Spring和Hibernate框架的...
4. **后续学习路径**:掌握基本的约束定义和验证方法后,可以进一步探索如何使用分组、自定义错误消息以及更高级的功能,如方法级验证和程序化约束定义。 **二、逐步解析验证过程** 1. **定义约束**: - 字段级...
在本文中,我们将深入探讨Hibernate Validator的基本概念、内置约束、自定义约束以及注解的使用,帮助新手入门并巩固高手的技能。 一、Hibernate Validator 简介 Hibernate Validator是Hibernate项目的一部分,...
4. **创建事务Transaction**:事务管理是数据库操作的基础,Hibernate提供了对事务的管理支持。 5. **持久化操作**:包括保存、更新、删除和查询对象,所有操作都在事务的保护下进行。 6. **提交事务**:事务完成...
而`hibernate.cfg.xml`是Hibernate的核心配置文件,它定义了数据库连接、实体类映射以及其它关键设置,是理解和使用Hibernate的基础。 一、文件结构 `hibernate.cfg.xml`文件主要由以下几个部分组成: 1. **XML...
通过这个登录实例,你可以学习到如何在实际项目中集成Struts2、Spring和Hibernate,理解它们之间的协作方式,以及如何编写和配置相关的代码。同时,这也将帮助你掌握Java Web开发的基础知识,提高解决实际问题的能力...
- `hibernate.hbm2ddl.auto`: 控制Hibernate自动创建、更新或验证数据库表结构,如`create`、`update`、`validate`或`none`。 - `entity_package_to_scan`: 指定包含实体类的包名,Hibernate会自动扫描这些包下的...
Hibernate Validator 4.3.0.Final版本在提供基础验证功能的同时,也注重性能和易用性的优化。它的出现,让开发者能够在Java应用中轻松实现数据验证,降低了出错风险,提高了代码质量。无论是简单的业务场景还是复杂...