2014-07-08 93 views
1

我工作的一個項目,我有一個多對多關聯,在未來的方式:Hibernate的多對多關聯刪除更新

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; 

} 

當我更新馬卡報對象,在加入記錄表格被刪除,其中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

你爲什麼要設置實體的ID爲空?這是第一次保存嗎?或更新? – Zeus

+0

這個想法有點奇怪。當一個Marca對象被修改時,需要創建一個引用原始Marca的新記錄,因此我這樣做: entity.setReferencia(id); 對象的'實體'包含修改後的數據,然後我將id設置爲空以指示Hibernate保存它,然後從數據庫加載oiriginal記錄並更新它。 如果我不是很清楚,請告訴我。 – imarban

回答

0

是 '馬卡報boject ID' 主鍵

碼? 通常你不會修改主鍵,如果你這樣做,那麼你可以期望刪除相關數據(如果Cascade = all)。我建議你在試圖更新Marca對象ID並使用新的ID再次保存到數據庫時拉取子集(Eager load)。 (當然,你必須在保存之前用舊主鍵刪除數據)

+0

是Marca對象具有標識主鍵,但在更新對象時Id未被修改,其他屬性更新。我編輯的答案包括整個馬卡班。 – imarban

+0

您可以嘗試將joincolumn和inversjoincolumn屬性設置爲可更新的,可爲null = false。 http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example-annotation/ – Zeus

+0

它沒有幫助。無論如何,我認爲這可以避免修改時,我真的想修改一個Marca對象。 – imarban

相關問題