有一个person类,和一个contract类,它们之间是1对多的关系,即一个person对应多个contract。在person类中有一个Set型的contract对象,在contract类中有一个person型的对象;
问题是:
    1、hibernate3 会自动把lazy设为true,那么我在load出一个person的时候是不是就没有执行select contract的操作,而是在第一次调用person.getContracts()的时候才去执行select contact的语句?
    2、现在我load出了一个person对象,想修改和这个person相关联的某一个contra的某个属性,比如我执行:
    person.getContracts().get(0).setName("xxx");
这样是否可以级联的更新进contract表中呢?

解决方案 »

  1.   

    可以的,只要在contract.xml文件中的set属性加上  cascade="all-delete-orphan" 
    <set name="contracts" inverse="true"  cascade="all-delete-orphan" order-by="caption" >
      

  2.   

    1.如果你不想用延迟加载则改:
    <set name="contracts" inverse="true"  fetch="join" lazy="false" >
    2.<set name="contracts" inverse="true"  cascade="all"  >
      

  3.   

    1、hibernate3 会自动把lazy设为true,那么我在load出一个person的时候是不是就没有执行select contract的操作,而是在第一次调用person.getContracts()的时候才去执行select contact的语句?对,但这样往往会报 no session or session is closed 错误 我现在做是设置lazy="false" 这样就不会延迟加载了,在加载类是就将集合对象加载进来
     
      2、现在我load出了一个person对象,想修改和这个person相关联的某一个contra的某个属性,比如我执行: 
        person.getContracts().get(0).setName("xxx"); 
    这样是否可以级联的更新进contract表中呢?设置 inverse="true" 表示对方管理关系  cascade="all" 表示级联更新结果当person更新时也对集合处理
      

  4.   

    你好,wjy503977212!我就是想让它延迟加载,因为这个person对象里面还有很多别的关联,那我是不是就让person.hbm.xml里面的<set>标签的lazy设成true还是extra呢?
      

  5.   

    如果你想让person里的普通属性不延迟加载的话在class标签里设置lazy=false
    如果想设置person里的set延迟加载,lazy设为true和extra都可以
    只不过extra更智能化一点,设为extra查询所有记录时会自动发出select count(*)的语句
      

  6.   

    所谓的lazy就是在你不需要用到一个属性的时候,hibernate是不会去查询的。所以,当你调用
    person.getContracts().get(0)时候,hibernate知道你要用到contracts了,当然会乖乖地查来给你了。要不然,就不叫lazy,应该叫不听使唤了!!!
    其实不光是一对多。在你Person person = dao.get(id)等到一个实例的时候,这个时候也是lazy,实际上他只给你了一个代理类,里面只有id有值,其他属性一律为空。但你调用person.getXXX(),或是调用person.setXXX()的时候,就能得到或是修改。是一个道理的。
      

  7.   

    至于nosession这个问题。就交给spring去完美的解决吧。