2012-06-26 36 views
1

我正在使用Hibernate 4.0.1.Final。我有一個唯一約束列的表...我可以讓Hibernate根據一個唯一的列約束來替換一個對象嗎?

@Entity 
@Table(name = "cb_contract", 
    uniqueConstraints = {@UniqueConstraint(columnNames={"ORDER_ID"})} 
) 
public class Contract { 
    ... 
    @Column(name = "ORDER_ID") 
    private String orderId; 

目前,如果我嘗試並保存有訂單ID列的值相同的兩個對象,使用下面的方法...

protected void saveOrUpdate(Object obj) { 
    final Session session = sessionFactory.getCurrentSession(); 
    session.saveOrUpdate(obj); 
} 

保存第二個實例時,出現「org.hibernate.exception.ConstraintViolationException:完整性約束違例:唯一約束或索引違例」異常。有沒有一種方法可以讓Hibernate根據獨特的列保存或替換對象,還是需要先搜索對象,如果它存在,請將其刪除,然後重新插入對象?

回答

2

我認爲你是正確的,但匹配是最接近你想要做的是記錄在這裏的東西 - Can Hibernate work with MySQL's "ON DUPLICATE KEY UPDATE" syntax?

取決於什麼是你正在嘗試做的,我會得到關心你如果已經存在具有相同鍵/約束的記錄,則很樂意覆蓋現有的記錄。

我寧願完全刪除唯一的約束,而是爲那個orderId代替最大的Id。這樣,您至少可以保留具有該訂單ID的所有合同的備份副本。但是,這在內存空間上明顯效率較低。

+1

關於「DUPLICATE KEY UPDATE」語法,它可以模仿MySQL的REPLACE INTO語法 - http://dev.mysql.com/doc/refman/5.0/en/replace.html?那最終是我想要做的。我試着把「REPLACE」sql語句放入@SQLInsert註釋中,但是得到一個錯誤,說Hibernate沒有識別出「REPLACE」標記。 – Dave

+1

看看 - http://stackoverflow.com/questions/11235501/mysql-insert-row-on-duplicate-key-update-multiple-columns @Dave – Dedawn