In this example, we will see some more validation constraints such as @email, @past, @length, etc. And also we will also define custom error message.
Environment
- Eclipse 3.7 Indigo IDE
- Hibernate 4.1.1
- JavaSE 1.6
- MySQL 5.1
Step 1:
Let us set the environment. Follow this post to set up Hibernate with java in eclipse IDE.
Step 2:
We need to add some more jar files for Validator. Please follow the steps
- Right click on Project and Select Properties.
- Select Java Build Path.
- Click “Add External JARs..” and include the following jar files.
hibernate-validator-4.0.2.GA.jar
hibernate-validator-annotation-processor-4.1.0.Final.jar
slf4j-simple-1.4.2.jar
log4j-1.2.15.jar
slf4j-api-1.4.2.jar
validation-api-1.0.0.GA.jar
Step 3
In the mysql, create the following table.
CREATE TABLE `validatorexample3` (
`ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
`FirstName` VARCHAR(255) DEFAULT NULL,
`LastName` VARCHAR(255) DEFAULT NULL,
`BirthDate` DATE DEFAULT NULL,
`CustomerNumber` VARCHAR(255) DEFAULT NULL,
`SSN` VARCHAR(255) DEFAULT NULL,
`Email` VARCHAR(255) DEFAULT NULL,
`zip` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=INNODB DEFAULT CHARSET=latin1
Step 4
Now let us create the java bean for the above table.
package domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.util.Date;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table(name = "validatorexample3")
public class validatorexample3 {
@Id
@GeneratedValue
@Column(name = "ID")
private int ID;
@NotNull(message="First name cannot be empty")
@Size(min = 2,message="First name is too small")
@Column(name = "FirstName")
private String firstName;
@Length(min = 2, max = 50, message="LastName should be 2 to 50 Characters size")
@Column(name = "LastName")
private String lastName;
@Column(name = "BirthDate")
@Temporal(TemporalType.DATE)
@Past(message="Date of birth should be past date")
private Date birthDate;
@Pattern(regexp = "^[a-zA-Z]{2}-\\d+$", message="Invalid Customer Number")
@Column(name = "CustomerNumber")
private String customerNumber;
@Pattern(regexp= "[0-9]{3}-[0-9]{2}-[0-9]{4}", message="Invalid SSN format")
@Column(name = "ssn")
private String ssn;
@Column(name = "Email")
@org.hibernate.validator.constraints.Email(message="Invalid Email Format")
private String Email;
@NotEmpty
@Length(min = 5, max = 5, message = "{zip.length}")
@Pattern(regexp = "[0-9]+", message="Invalid Zip")
@Column(name = "zip")
private String zip;
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public String getCustomerNumber() {
return customerNumber;
}
public void setCustomerNumber(String customerNumber) {
this.customerNumber = customerNumber;
}
public String getSsn() {
return ssn;
}
public void setSsn(String ssn) {
this.ssn = ssn;
}
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
}
Now let us map this class in the hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/sampledb</property>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Mapping Classes -->
<mapping class="domain.validatorexample3" />
</session-factory>
</hibernate-configuration>
Very Important, We need add one more property in the above xml file as follows
<property name="javax.persistence.validation.mode">none</property>
package domain;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.util.Date;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table(name = "validatorexample3")
public class validatorexample3 {
@Id
@GeneratedValue
@Column(name = "ID")
private int ID;
@NotNull(message="First name cannot be empty")
@Size(min = 2,message="First name is too small")
@Column(name = "FirstName")
private String firstName;
@Length(min = 2, max = 50, message="LastName should be 2 to 50 Characters size")
@Column(name = "LastName")
private String lastName;
@Column(name = "BirthDate")
@Temporal(TemporalType.DATE)
@Past(message="Date of birth should be past date")
private Date birthDate;
@Pattern(regexp = "^[a-zA-Z]{2}-\\d+$", message="Invalid Customer Number")
@Column(name = "CustomerNumber")
private String customerNumber;
@Pattern(regexp= "[0-9]{3}-[0-9]{2}-[0-9]{4}", message="Invalid SSN format")
@Column(name = "ssn")
private String ssn;
@Column(name = "Email")
@org.hibernate.validator.constraints.Email(message="Invalid Email Format")
private String Email;
@NotEmpty
@Length(min = 5, max = 5, message = "{zip.length}")
@Pattern(regexp = "[0-9]+", message="Invalid Zip")
@Column(name = "zip")
private String zip;
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getBirthDate() {
return birthDate;
}
public void setBirthDate(Date birthDate) {
this.birthDate = birthDate;
}
public String getCustomerNumber() {
return customerNumber;
}
public void setCustomerNumber(String customerNumber) {
this.customerNumber = customerNumber;
}
public String getSsn() {
return ssn;
}
public void setSsn(String ssn) {
this.ssn = ssn;
}
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
public String getZip() {
return zip;
}
public void setZip(String zip) {
this.zip = zip;
}
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/sampledb</property>
<property name="connection.username">root</property>
<property name="connection.password">123</property>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Mapping Classes -->
<mapping class="domain.validatorexample3" />
</session-factory>
</hibernate-configuration>
Now let us add our test class.
package test;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import org.hibernate.Session;
import HibernateUtilities.HibernateUtil;
import domain.validatorexample3;
public class Test {
public static void main(String[] args) throws Throwable {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
validatorexample3 v1 = new validatorexample3();
v1.setFirstName("a");
v1.setLastName("012345678900123456789001234567890012345678900123456789001234567890");
v1.setBirthDate(sdf.parse(sdf.format(new Date())+1));
v1.setCustomerNumber("#@3434");
v1.setSsn("3fdfdfdf");
v1.setEmail("asdasdasdsadsad");
v1.setZip("asdasdsadasd");
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<validatorexample3>> constraintViolations = validator
.validate(v1);
// printing the results
for (ConstraintViolation<validatorexample3> constraintViolation : constraintViolations) {
System.out.println(constraintViolation.getPropertyPath() + " -> "
+ constraintViolation.getMessage());
}
Session session = HibernateUtil.beginTransaction();
session.save(v1);
HibernateUtil.CommitTransaction();
}
}
2 [main] INFO org.hibernate.validator.util.Version - Hibernate Validator 4.0.2.GA
12 [main] INFO org.hibernate.validator.engine.resolver.DefaultTraversableResolver - Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
Email -> Invalid Email Format
lastName -> LastName should be 2 to 50 Characters size
birthDate -> Date of birth should be past date
zip -> {zip.length}
zip -> Invalid Zip
firstName -> First name is too small
ssn -> Invalid SSN format
customerNumber -> Invalid Customer Number
log4j:WARN No appenders could be found for logger (org.jboss.logging).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into validatorexample3 (Email, BirthDate, CustomerNumber, FirstName, LastName, ssn, zip) values (?, ?, ?, ?, ?, ?, ?)
That’s all.
Project Structure