【发布时间】:2014-07-08 17:28:52
【问题描述】:
我正在做一个项目,我有一个多对多关联的下一个方式:
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);
}
【问题讨论】:
-
为什么要将实体的 ID 设置为 null?这是第一次保存吗?还是更新?
-
这个想法有点奇怪。修改 Marca 对象时,需要创建一个引用原始 Marca 的新记录,因此我这样做: entity.setReferencia(id);对象“实体”包含修改的数据,然后我将 id 设置为 null 以指示 Hibernate 保存它,然后从数据库中加载原始记录并更新它。如果我不是很清楚,请告诉我。
标签: hibernate many-to-many jointable