Java Bean验证不起作用。I';m使用JPA2.0和Hibernate3.3
验证适用于前端(jsf)。然而,它并没有在prepersist上得到验证。我将manufacturer设置为null,并将其存储在数据库中,而不是抛出约束冲突异常。谢谢 以下是我的实体的相关部分:Java Bean验证不起作用。I';m使用JPA2.0和Hibernate3.3,java,jpa,bean-validation,Java,Jpa,Bean Validation,验证适用于前端(jsf)。然而,它并没有在prepersist上得到验证。我将manufacturer设置为null,并将其存储在数据库中,而不是抛出约束冲突异常。谢谢 以下是我的实体的相关部分: import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.p
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;
这是我的persistence.xml文件:
<?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>
Hibernate 3.3不是JPA2.0实现。JPA2.0需要Hibernate>=3.5.1。 Hibernate3.3中没有集成bean验证API 要将bean验证集成到hibernate 3.3中,您必须实现一个BeanValidationEventListener。以Hibermate实现为例:
您是否尝试过像这样定义列@column(name=“MANUFACTURER”,nullable=false)?可能不会抛出约束冲突,但它应该抛出和异常,您可以捕获和处理它们。@ChadNC确实抛出和异常,但我认为这不是我要寻找的解决方案。例如,我可以使用这种方法在@Size(min=2,max=14)应用此约束吗?您确定事件侦听器会触发吗?您可以尝试将@PrePersist添加到实体中。如果这个方法被调用,我希望Bean验证也会发生。你也尝试过使用“auto”作为验证模式(即使“callback”也可以)。“只是想缩小问题的范围。”哈迪谢谢你的意见。我将尝试这两件事并报告。我是否需要通过设置/注释来启动事件侦听器,还是应该自动启动?我没有使用任何自定义侦听器。
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;
}
}