我正在开展一个项目,我将在下一个方面与多对多关联:
public class Marca implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "nombre")
private String nombre;
@Column(name = "referencia")
private Long referencia;
@ManyToMany
@JoinTable(name = "MarcaTipoEquipo", joinColumns = { @JoinColumn(name = "idMarca") }, inverseJoinColumns = { @JoinColumn(name = "idTipoEquipo") })
private Set<TipoEquipo> equipos;
}
public class TipoEquipo implements Serializable {
@ManyToMany(mappedBy = "equipos")
private Set<Marca> marcas;
}
当我更新Marca对象时,连接表中的记录将被删除,其中id等于Marca对象id。
我已尝试在TipoEquipo类中添加equals和hashcode方法,因为这篇帖子Why is hibernate deleting rows from join table when adding element to set mapping many-to-many?建议:
@Override
public boolean equals(Object obj) {
return ((TipoEquipo) obj).getNombre().equalsIgnoreCase(this.nombre);
}
@Override
public int hashCode() {
return super.hashCode();
}
我做错了什么?如何避免Hibernate删除连接表记录?
编辑:
存储数据的代码
public synchronized Marca actualizar(Marca entity) {
Long id = entity.getId();
entity.setId(null);
Marca marcaAnterior = busquedaGenericaBs.buscarPorId(Marca.class, id);
marcaAnterior.setIdEstatus(ClaveEstatus.POR_VALIDAR_MODIFICACION
.getClave());
entity.setIdEstatus(ClaveEstatus.POR_VALIDAR_MODIFICACION_NUEVO
.getClave());
entity.setReferencia(id);
genericDao.save(entity);
return genericDao.update(marcaAnterior);
}
答案 0 :(得分:0)
&#39; Marca boject id&#39;主键? 通常您不会修改主键,如果您这样做,那么您可以预期相关数据将被删除(如果Cascade = all)。当您尝试更新Marca对象ID并使用新ID再次将其保存到数据库时,我建议您拉出子集合(Eager load)。 (当然,在保存之前你必须用旧的主键删除数据)