每当我尝试将子对象持久化到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);
}
答案 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();
这是一个问题,因为(再次)这些关系的相反方面从未设置过。