[英]Java - Merge Hibernate beans/entities - before saveOrUpdate
[英]Why is hibernate deleting before saveOrUpdate ()?
我有:列和元素之間的關系。 擁有關系的實體是列。 但是,當我保存列映射時,會發生以下情況:
1)在第一次迭代中,Hibernate:
1.1)保存第一個Column元素
1.2)在column_element表中插入兩個元素
遵循控制台:
Hibernate: select nextval ('hibernate_sequence')
Hibernate: insert into coluna (COLUNA_ALIAS_OPERACAO, COLUNA_CLAUSULA, COLUNA_DATA_DOIS, COLUNA_DATA_UM, COLUNA_EXIBE_FILTRO, COLUNA_EXIBE_NO_RELATORIO, COLUNA_EXIBE_TOTALIZADOR, COLUNA_INDEX, COLUNA_LABEL, COLUNA_NOME, COLUNA_OPERACAO, COLUNA_OPERACAO_REFERNCIANDO_ALIAS, RELATORIO_ID, COLUNA_TEMPO_DOIS, COLUNA_TEMPO_UM, COLUNA_TIPO_CLAUSULA_TEXTO, COLUNA_TIPO_EXIBICAO, COLUNA_TIPO_FILTRO, COLUNA_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into coluna_elemento (COLUNA_ID, ELEMENTO_DOMINIO_ID) values (?, ?)
Hibernate: insert into coluna_elemento (COLUNA_ID, ELEMENTO_DOMINIO_ID) values (?, ?)
此時,我數據庫的表column_element如下所示:
coluna_id | elemento_id
988 860
988 861
到目前為止,一切都按預期進行。
2)在第二個迭代中,Hibernate:
2.1)保存第二列元素
2.2)從column_element元素中刪除先前保存的元素
2.3)在column_element_element中插入兩個元素
如以下控制台的輸出所示:
Hibernate: select nextval ('hibernate_sequence')
Hibernate: insert into coluna (COLUNA_ALIAS_OPERACAO, COLUNA_CLAUSULA, COLUNA_DATA_DOIS, COLUNA_DATA_UM, COLUNA_EXIBE_FILTRO, COLUNA_EXIBE_NO_RELATORIO, COLUNA_EXIBE_TOTALIZADOR, COLUNA_INDEX, COLUNA_LABEL, COLUNA_NOME, COLUNA_OPERACAO, COLUNA_OPERACAO_REFERNCIANDO_ALIAS, RELATORIO_ID, COLUNA_TEMPO_DOIS, COLUNA_TEMPO_UM, COLUNA_TIPO_CLAUSULA_TEXTO, COLUNA_TIPO_EXIBICAO, COLUNA_TIPO_FILTRO, COLUNA_ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: delete from coluna_elemento where COLUNA_ID=?
Hibernate: insert into coluna_elemento (COLUNA_ID, ELEMENTO_DOMINIO_ID) values (?, ?)
Hibernate: insert into coluna_elemento (COLUNA_ID, ELEMENTO_DOMINIO_ID) values (?, ?)
然后,數據庫中的column_element元素如下所示:
coluna_id | elemento_id
989 860
989 861
我所期望的是:
coluna_id | elemento_id
988 860
988 861
989 860
989 861
我究竟做錯了什么?
我保存列映射的代碼如下:
private void salvaColunas() {
for (Map.Entry<Integer, Coluna> entry : mapaColunas.entrySet()){
Coluna coluna = entry.getValue();
coluna.setRelatorio(relatorio);
colunaDao.saveOrUpdate(coluna);
}
}
我的Dao類的saveOrUpdate方法如下:
public void saveOrUpdate(T obj) {
Session session;
Transaction tx = null;
try {
session = HibernateUtil.getSessionFactory().getCurrentSession();
}catch (HibernateException ex) {
session = HibernateUtil.getSessionFactory().openSession();
}
try{
tx = session.beginTransaction();
session.saveOrUpdate(obj);
tx.commit();
} catch (RuntimeException e) {
e.printStackTrace();
} finally {
if(session.isOpen()) {
session.close();
}
}
}
Column類中的映射(已經實現了equals和hashCode方法)如下所示:
@ManyToMany(fetch= FetchType.LAZY, cascade= {CascadeType.PERSIST,cadeType.REFRESH, CascadeType.MERGE})
@JoinTable(name="coluna_elemento", joinColumns={
@JoinColumn(name="COLUNA_ID", nullable=false, updatable=false )},inverseJoinColumns = {@JoinColumn(name = "ELEMENTO_DOMINIO_ID", nullable=false, updatable = false) })
private Set<ElementoDominio> elementosDoDominio;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((label == null) ? 0 : label.hashCode());
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Coluna other = (Coluna) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (label == null) {
if (other.label != null)
return false;
} else if (!label.equals(other.label))
return false;
if (nome == null) {
if (other.nome != null)
return false;
} else if (!nome.equals(other.nome))
return false;
return true;
}
我的Element類(也實現了equals和hashCode方法)如下所示:
@ManyToMany(fetch = FetchType.LAZY, mappedBy = "elementosDoDominio")
private Set<Coluna> colunas;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((label == null) ? 0 : label.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ElementoDominio other = (ElementoDominio) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (label == null) {
if (other.label != null)
return false;
} else if (!label.equals(other.label))
return false;
return true;
}
Column和Element類都具有更多屬性,包括Hibernate生成的id。 所有帶有吸氣劑和吸氣劑。
強烈建議避免使用@ManyToMany子句,您可以嘗試通過將關聯表顯式實現為實體來嘗試更改它,而使用@manyToOne代替:
ElementoDominio類
@OneToMany(mappedBy="element")
private Set<ElementoDominio> elementosDoDominio;
科魯納班
@OneToMany(mappedBy="colunas")
private Set<Coluna> colunas;
ElementoColuna [新實體]
@ManyToOne
@JoinColumn(name="element_id")
private ElementoDominio element
@ManyToOne
@JoinColumn(name="colunas_ID")
private Coluna colunas
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.