尝试持久化时出现ConstraintViolationException

时间:2016-02-04 22:25:22

标签: hibernate jpa

每当我尝试将子对象持久化到JPA中的现有父对象时,我都会收到以下错误:

  

引起:javax.validation.ConstraintViolationException:在组的持续时间[classes.entidades.Sucursal]中验证失败[javax.validation.groups.Default,]   违反约束的清单:[       ConstraintViolationImpl {interpolatedMessage =' Por favor ingrese un valor en direccion',propertyPath = direccion,rootBeanClass = class store.entidades.Sucursal,messageTemplate =' Por favor ingrese un valor en direccion'}       ConstraintViolationImpl {interpolatedMessage =' Por favor ingrese un valor en telefono',propertyPath = telefono,rootBeanClass = class store.entidades.Sucursal,messageTemplate =' Por favor ingrese un valor en telefono'}   ]

这是我使用的父实体类:

    @Entity
    public class Sucursal {

        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private int id;

        // nombre del encargado de esa sucursal
        private String subgerente;

        @NotNull(message = "Por favor ingrese un valor en direccion")
        @Column(length = 120)
        private String direccion;

        @NotNull(message = "Por favor ingrese un valor en telefono")
        @Column(length = 36, unique = true)
        private String telefono;

        @OneToMany(cascade = CascadeType.MERGE, fetch = FetchType.EAGER, orphanRemoval = true)
        @JoinColumn(name = "producto_sucursal", referencedColumnName = "id")
        private List<Producto> producto = new ArrayList<Producto>();

        //getters and setters

这是我使用的子实体类:

 @Entity
    public class Producto {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @NotNull(message = "Por favor ingrese un valor")
    private String nombre;

    @NotNull(message = "Por favor ingrese un valor")
    @Column(length = 140)
    private String descripcion;

    @NotNull(message = "Por favor ingrese un valor")
    private double precio;

    @NotNull(message = "Por favor ingrese un valor")
    private String imagen1;
    @NotNull(message = "Por favor ingrese un valor")
    private String imagen2;
    @NotNull(message = "Por favor ingrese un valor")
    private String imagen3;

    private int megusta;
    private int nomegusta;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    @JoinColumn(name = "comentario_producto", referencedColumnName = "id")
    private List<Comentario> comentario = new ArrayList<Comentario>();//

    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
    @JoinColumn(name = "producto_subcategoria")
    private Subcategoria subcategoria = new Subcategoria();

    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
    @JoinColumn(name = "producto_categoria")
    private Categoria categoria = new Categoria();

    @ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
    @JoinColumn(name = "producto_sucursal")
    private Sucursal sucursal = new Sucursal();

    //getters and setters

我的Sucursal DAO课程如下:

@Stateless
public class SucursalDAO implements Serializable {

    @Inject
    private EntityManager entityManager;

    public void save(Sucursal sucursal) {
        if (entityManager.find(Sucursal.class, sucursal.getId()) == null) {
            insertar(sucursal);

        } else {
            update(sucursal);
        }
    }

    // ...
}

每当我点击前端的保存按钮时,它都会调用此方法:

public void guardar() {

    System.out.println(newSucursal.getDireccion());
    System.out.println(newSucursal.getTelefono());

    for (int i = 0; i < listproductos.size(); i++) {

        // listproductos.get(i).setSucursal(newSucursal);
        System.out.println(listproductos.get(i).toString());

        newSucursal.getProductos().add(listproductos.get(i));
    }

    sucursalDAO.save(newSucursal);
}

当我调用此保存方法时,我将新的孩子 Productos 添加到我的 Sucursales ,但是当我尝试保留Parent时,它会给我上面发布的错误。 我尝试了很多东西,但似乎无法弄清问题是什么? 是否有另一种将子实体保存到现有父实体的方法?

修改

这是修复我的保存方法问题的代码:

public void guardar() {

        System.out.println(newSucursal.getDireccion());
        System.out.println(newSucursal.getTelefono());

        for (int i = 0; i < listproductos.size(); i++) {

            listproductos.get(i).setSucursal(newSucursal);

            Categoria cat = new Categoria();
            cat = categoriaDAO.read(listproductos.get(i).getCategoria().getId());
            listproductos.get(i).setCategoria(cat);

            Subcategoria subcat = new Subcategoria();
            subcat = subcategoriaDAO.read(listproductos.get(i).getSubcategoria().getId());
            listproductos.get(i).setSubcategoria(subcat);

            System.out.println(listproductos.get(i).toString());

            newSucursal.getProductos().add(listproductos.get(i));
        }

        // newSucursal.setProductos(listproductos);

        sucursalDAO.save(newSucursal);
    }

1 个答案:

答案 0 :(得分:1)

问题的关键在于你需要分配关系的两个方面:

public void guardar() {

    System.out.println(newSucursal.getDireccion());
    System.out.println(newSucursal.getTelefono());

    for (int i = 0; i < listproductos.size(); i++) {

        listproductos.get(i).setSucursal(newSucursal);
        System.out.println(listproductos.get(i).toString());

        newSucursal.getProductos().add(listproductos.get(i));
    }

    sucursalDAO.save(newSucursal);
}

你出于某种原因已经注释掉了。

此外,您的所有@ManyToOne关系都使用以下新对象进行初始化:

@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
@JoinColumn(name = "producto_subcategoria")
private Subcategoria subcategoria = new Subcategoria();

这是一个问题,因为(再次)这些关系的相反方面从未设置过。