The validation works for the front end (jsf). However, it is not getting validated on prepersist. I’m setting manufacturer to null and it is getting stored in the database as such instead of throwing the constraint violation exception. Thanks.
Here is the relevant part of my entity:
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
/**
* The persistent class for the CAR database table.
*
*/
@Entity
@Table(name="CAR")
public class Car implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="CAR_ID")
private int carId;
@Column(name="MANUFACTURER")
@NotNull(message = "A manufacturer is required.")
private String manufacturer;
Here is my persistence.xml file:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
<persistence-unit name="src_persistence">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/BEAN_VALIDATION_DS</jta-data-source>
<class>
xxx.beanvalidation.persistence.Car
</class>
<validation-mode>CALLBACK</validation-mode>
<properties>
<property name="javax.persistence.validation.mode" value="callback"/>
<property name="openjpa.Optimistic" value="false"/>
<property name="openjpa.LockManager" value="none"/>
<property name="openjpa.jdbc.Schema" value="dbo"/>
<property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.CMTTransactionFactory" />
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
<property name="hibernate.current_session_context_class" value="thread" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
</properties>
</persistence-unit>
</persistence>
Here is my DAO:
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.westfieldgrp.beanvalidation.persistence.Car;
import com.westfieldgrp.beanvalidation.persistence.Driver;
import com.westfieldgrp.beanvalidation.persistence.Person;
import com.westfieldgrp.common.data.dao.DAOInterface;
public class CarDAO {
private EntityManager entityManager;
public void save(Person convertedPerson, Driver convertedDriver, Car convertedCar) {
EntityManager em = getEntityManager();
//convertedPerson.setName(convertedPerson.getName()); // To test JPA validation
Person savedPerson = em.merge(convertedPerson);
convertedDriver.setPersonId(savedPerson.getPersonId());
Driver savedDriver = em.merge(convertedDriver);
convertedCar.setDriverId(savedDriver.getPersonId());
if("test".equals(convertedCar.getManufacturer())){
convertedCar.setManufacturer(null);// To test JPA validation
}
em.persist(convertedCar);
em.flush();
}
public EntityManager getEntityManager() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("src_persistence");
entityManager = emf.createEntityManager();
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}
Hibernate 3.3 is NOT a JPA2.0 implementation. You need Hibernate >=3.5.1 for JPA2.0.
There is no integration of the bean-validation API in Hibernate 3.3
To integrate the bean-validation into hibernate 3.3 you have to implement an BeanValidationEventListener. See the Hibermate implementation as an example:
https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/cfg/beanvalidation/BeanValidationEventListener.java