Hibernate在更新时多对多关联删除

时间:2014-07-08 17:28:52

标签: hibernate many-to-many jointable

我正在开展一个项目,我将在下一个方面与多对多关联:

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);
}

1 个答案:

答案 0 :(得分:0)

&#39; Marca boject id&#39;主键? 通常您不会修改主键,如果您这样做,那么您可以预期相关数据将被删除(如果Cascade = all)。当您尝试更新Marca对象ID并使用新ID再次将其保存到数据库时,我建议您拉出子集合(Eager load)。 (当然,在保存之前你必须用旧的主键删除数据)