本文最初發(fā)表在http://www.lovestblog.cn,轉(zhuǎn)載請(qǐng)注明出處,謝謝。
最近在忙一個(gè)項(xiàng)目,使用的是Flex+Spring+Hibernate,期間碰到一個(gè)問(wèn)題,有必要在此記錄一下,也方便有相似問(wèn)題的來(lái)者參考下
問(wèn)題描述:有一個(gè)用戶表和一個(gè)用戶詳情表,這兩個(gè)表是一個(gè)一對(duì)一的單向關(guān)聯(lián)關(guān)系,即在用戶表中一個(gè)外鍵引用用戶詳情表,我在UserInfo的映射文件中使用的是many-to-one,設(shè)置了unique="true"表示一對(duì)一關(guān)系,設(shè)置了cascade="save-update"表示的是在保存useInfo對(duì)象的時(shí)候會(huì)自動(dòng)保存與之關(guān)聯(lián)的userDetails臨時(shí)對(duì)象,即我希望的是先執(zhí)行一個(gè)在用戶詳情表中的插入語(yǔ)句然后再執(zhí)行一個(gè)在用戶表中的插入語(yǔ)句,userInfo對(duì)象是從flex端傳過(guò)來(lái)的,當(dāng)然也設(shè)置了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;
}
后面發(fā)現(xiàn)執(zhí)行的sql語(yǔ)句只有一條插入語(yǔ)句,就是在用戶表中的一個(gè)插入,由于外鍵的關(guān)聯(lián)作用,是用戶表的這條插入也無(wú)法執(zhí)行,這就是問(wèn)題所在了。
問(wèn)題解決:這個(gè)問(wèn)題我也沒有具體研究Hibernate的源碼,我先寫了個(gè)測(cè)試類,發(fā)現(xiàn)僅僅在java中執(zhí)行操作的話是可以正確執(zhí)行兩條插入語(yǔ)句的,但是通過(guò)flex傳過(guò)來(lái)就有問(wèn)題了,那說(shuō)明是flex端傳參數(shù)過(guò)來(lái)的問(wèn)題,于是我試著修改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;
}
這樣一來(lái)問(wèn)題解決了,順利執(zhí)行了兩條插入語(yǔ)句。
如果朋友知道具體原因的話希望給我留言了,同時(shí)也希望該記錄能幫助碰到此類問(wèn)題的朋友。