【问题标题】:Hibernate many to many association delete on update更新时休眠多对多关联删除
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 是的,Marca 对象有一个身份主键,但是当我更新对象时,Id 没有被修改,其他属性也在更新。我编辑答案以包括整个 Marca 课程。
  • 您可以尝试将 joincolumn 和 inversjoincolumn 属性设置为可更新的,可空的 = false。 mkyong.com/hibernate/…
  • 没用。无论如何,我认为这可以避免在我真的想修改 Marca 对象时进行修改。
  • 是的,它可以帮助您在更新时不包含连接表。你说,它不工作?意味着连接表中的数据仍在删除?您可以发布存储数据的代码吗?
  • 是的,连接表中的数据还在删除中,我编辑问题在我存储数据的地方添加代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
相关资源
最近更新 更多