最近在忙一个项目,使用的是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;
}
后面发现执行的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;
}
这样一来问题解决了,顺利执行了两条插入语句。
如果朋友知道具体原因的话希望给我留言了,同时也希望该记录能帮助碰到此类问题的朋友。
posted on 2010-06-22 11:20
你假笨 阅读(1564)
评论(0) 编辑 收藏