0

这是我的 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;
    }
}

实体:

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PrePersist;
import javax.persistence.Table;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
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="INSPECTION_PASSED")
    @AssertTrue(message = "The car has to pass the vehicle inspection first")//, groups = CarChecks.class)
    private boolean inspectionPassed;

    @Column(name="LICENSE_PLATE_NUMBER")
    @NotNull(message = "A license plate is required.")
    @Size(min = 2, max = 14, message="The license plate field must be 2-14 characters.")
    private String licensePlateNumber;

    @Column(name="MANUFACTURER")
    @NotNull(message = "A manufacturer is required.")
    private String manufacturer;

    @Column(name="REGISTERED")
    private boolean registered;

    @Column(name="SEAT_COUNT")
    @Min(value =2, message="The car must contain more than 1 seat.")
    private int seatCount;

    @Column(name="DRIVER_ID")
    private int driverId;

    @PrePersist
    public void testPrePersist(){
        System.out.println("@@@@PrePersist was called. " + manufacturer);
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<Car>> violations = validator.validate(this);
        for (ConstraintViolation<Car> violation : violations) {
               System.out.format("%s: %s%n",violation.getPropertyPath(), violation.getMessage());
        }
    }

    public Car() {
    }

    public int getCarId() {
        return this.carId;
    }

    public void setCarId(int carId) {
        this.carId = carId;
    }

    public boolean getInspectionPassed() {
        return this.inspectionPassed;
    }

    public void setInspectionPassed(boolean inspectionPassed) {
        this.inspectionPassed = inspectionPassed;
    }

    public String getLicensePlateNumber() {
        return this.licensePlateNumber;
    }

    public void setLicensePlateNumber(String licensePlateNumber) {
        this.licensePlateNumber = licensePlateNumber;
    }

    public String getManufacturer() {
        return this.manufacturer;
    }

    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    public boolean getRegistered() {
        return this.registered;
    }

    public void setRegistered(boolean registered) {
        this.registered = registered;
    }

    public int getSeatCount() {
        return this.seatCount;
    }

    public void setSeatCount(int seatCount) {
        this.seatCount = seatCount;
    }

    public void setDriverId(int diverId) {
        this.driverId = diverId;
    }

    public int getDriverId() {
        return driverId;
    }
}
4

2 回答 2

1

如果您在 pre persist 上使用基于生命周期的验证,则 persist 将自动失败并抛出ConstraintViolationException。如果验证失败,无需采取进一步行动来取消持久化。您只想以适当的方式处理异常。

于 2012-11-10T16:46:37.520 回答
1

您可以抛出包含所有错误或其他运行时异常的 javax.validation.ConstraintViolationException。

ConstraintViolationException(String message,<ConstraintViolation<?>> constraintViolations)

查看 Hibernate 中的 BeanValidationEventListener,因为它的作用相同。 https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/cfg/beanvalidation/BeanValidationEventListener.java

于 2012-11-07T15:51:42.720 回答