本文最初發表在http://www.lovestblog.cn,轉載請注明出處,謝謝。
最近在忙一個項目,使用的是Flex+Spring+Hibernate,期間碰到一個問題,有必要在此記錄一下,也方便有相似問題的來者參考下
問題描述:有一個用戶表和一個用戶詳情表,這兩個表是一個一對一的單向關聯關系,即在用戶表中一個外鍵引用用戶詳情表,我在UserInfo的映射文件中使用的是many-to-one,設置了unique="true"表示一對一關系,設置了cascade="save-update"表示的是在保存useInfo對象的時候會自動保存與之關聯的userDetails臨時對象,即我希望的是先執行一個在用戶詳情表中的插入語句然后再執行一個在用戶表中的插入語句,userInfo對象是從flex端傳過來的,當然也設置了userDetails屬性的值,在userInfo的dao文件中save方法是這樣的
public IvUserInfo save(IvUserInfo transientInstance) {
log.debug("saving IvUserInfo instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
return transientInstance;
}
log.debug("saving IvUserInfo instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
return transientInstance;
}
后面發現執行的sql語句只有一條插入語句,就是在用戶表中的一個插入,由于外鍵的關聯作用,是用戶表的這條插入也無法執行,這就是問題所在了。
問題解決:這個問題我也沒有具體研究Hibernate的源碼,我先寫了個測試類,發現僅僅在java中執行操作的話是可以正確執行兩條插入語句的,但是通過flex傳過來就有問題了,那說明是flex端傳參數過來的問題,于是我試著修改UserInfo的save方法:
public IvUserInfo save(IvUserInfo transientInstance) {
log.debug("saving IvUserInfo instance");
try {
IvUserDetails ud=new IvUserDetails();
ud.setQq(transientInstance.getIvUserDetails().getQq());
transientInstance.setIvUserDetails(ud);
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
return transientInstance;
}
這樣一來問題解決了,順利執行了兩條插入語句。
如果朋友知道具體原因的話希望給我留言了,同時也希望該記錄能幫助碰到此類問題的朋友。