2014-08-27 16 views
0

當我嘗試使用hibernate saveOrUpdate時,出現ConstraintViolationException。當我爲用戶插入一個全新的對象時,保存完美,但是當我嘗試更新它時失敗。爲外鍵引發ConstraintViolationException

在數據庫表我有一個獨特的NOT NULL主鍵和唯一不爲空命名用戶標識外鍵

我的POJO聲明如下;

@Id @GeneratedValue 
@Column(name = "id") 
private int id; 

@Column(name="userid") 
private int userid; 

@Column(name = "homephonenumber") 
protected String homeContactNumber; 

@Column(name = "mobilephonenumber") 
protected String mobileContactNumber; 

@Column(name = "photo") 
private byte[] optionalImage; 


@Column(name = "address") 
private String address; 

我的插入語句如下所示;

public boolean addCardForUser(String userid, Card card) { 

    if(StringUtilities.stringEmptyOrNull(userid)){ 
     throw new IllegalArgumentException("Cannot add card for null or empty user id"); 
    } 

    if(card == null){ 
     throw new IllegalArgumentException("Cannot null card to the database for user " + userid); 
    } 

    SessionFactory sf = null; 
    Session session = null; 

    try{ 
     sf = HibernateUtil.getSessionFactory(); 
     session = sf.openSession(); 
     session.beginTransaction(); 

     session.saveOrUpdate(card); 
     session.getTransaction().commit(); 
     return true; 
    }catch(Exception e){ 
     logger.error("Unable to add Card to the database for user " + userid); 
    }finally{ 
     DatabaseUtilities.closeSessionFactory(sf); 
     DatabaseUtilities.closeSession(session); 
    } 
    return false; 
} 

我得到的異常說

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: 重複條目 '16' 關鍵 'userid_UNIQUE'

和數據庫看起來像這樣

enter image description here

我做錯了什麼,數據庫條目是否應該更新?

+0

所以你的方法「addCardForUser」實際上更新卡?你是否嘗試記錄主鍵來檢查你是否正在更新? – Pablo 2014-08-27 10:51:07

回答

0

對於更新,你應該首先加載Card實例,更新一些字段後,然後調用addCardForUser來更新它,如果Card實例沒有通過hibernate加載,hibernate會將它識別爲新記錄,如果這張卡在數據庫中有userId和其他卡記錄,違反了唯一約束!

0

你不應該在你的外鍵上加一個唯一的約束。外鍵模擬一對多關係。雖然您的父對象可能只有一個用戶,但同一個用戶可能與許多不同的父對象有關。因此,對於一個userId,父對象表中不一定只有一行。

+0

這個例子中的外鍵實際上代表1:1的模型 - 一個個人卡可以由一個用戶擁有,一個用戶可以擁有一個個人卡 – Biscuit128 2014-08-27 10:41:12

+0

@ Biscuit128如果你有1:1模型,那麼你的兩個表都可以被合併 – neomega 2014-08-27 10:43:08

+0

你是我在讀那天,我想盡量避免它,雖然 – Biscuit128 2014-08-27 10:43:38