不知楼主在action中是否会操作session?看楼主的意思应该是分开的。一般而言,业务层应该与控制层分离,像楼主采用struts+hibernate情况下,业务层应该写成一些beans或直接放在DAO中。而这些业务方法调用完毕后应该自动关闭session。这样不会产生你说的“存储时报错,说有两个session连接在同一个数据集上”这种情况。对于关联的延时加载策略,一般是采用lazy=true,如果你想加载A则在方法内访问一次A对象(如getA.iterator)。至于对象C的保存,是不需要有对象A及B的,只需要他们的外键即可。如: C c = new C(); c.setAId(a.getId()); c.setBId(b.getId()); cDAO.save(c);另外如果Session采用get或find方法,不管lazy的设置如何都会采用立即检索的策略。
C c = new C();
c.setAId(a.getId());
c.setBId(b.getId());
cDAO.save(c);另外如果Session采用get或find方法,不管lazy的设置如何都会采用立即检索的策略。
<many-to-one
name="userpo"
column="USER_ID"
class="com.callcenter.ccpo.db_register.RegUserPO"
cascade="none"
update="false"
insert="false"
outer-join="true"
/>
C c = new C();
c.setAId(a.getId());
c.setBId(b.getId());
cDAO.save(c); 另外如果Session采用get或find方法,不管lazy的设置如何都会采用立即检索的策略。
-----------------------------------------------------------------------------------------
在关联的HBM中多对一那里要加上outer-join属性
<many-to-one
name= "userpo "
column= "USER_ID "
class= "com.callcenter.ccpo.db_register.RegUserPO "
cascade= "none "
update= "false "
insert= "false "
outer-join= "true "
/ >
-----------------------------------------------------------------------------------------
我的个人看法,你的表的关联关系太多,导致错误。应该从关联关系,找突破。至少不能从A-B,寻求突破!
据我所知应该是同一个数据的2个实利不能和同一个session关联的吧。如果你要加载的对象可能不是那么多的话,就别延迟加载了,立即加载也不错。
延迟加载只是和查询有关系的,你这里保存的问题不关延迟加载的事C.setA(a); //session里有a了,但你知道a是有属性b的,那么在session里面有b了
C.setB(b); //session里再次有b ,出现一个数据的2个实例和同一个session关联。
save(c) 解决的办法是想办法保存 a或b ,让 a或b来级连保存。