有一个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、hibernate3 会自动把lazy设为true,那么我在load出一个person的时候是不是就没有执行select contract的操作,而是在第一次调用person.getContracts()的时候才去执行select contact的语句?
2、现在我load出了一个person对象,想修改和这个person相关联的某一个contra的某个属性,比如我执行:
person.getContracts().get(0).setName("xxx");
这样是否可以级联的更新进contract表中呢?
<set name="contracts" inverse="true" cascade="all-delete-orphan" order-by="caption" >
<set name="contracts" inverse="true" fetch="join" lazy="false" >
2.<set name="contracts" inverse="true" cascade="all" >
2、现在我load出了一个person对象,想修改和这个person相关联的某一个contra的某个属性,比如我执行:
person.getContracts().get(0).setName("xxx");
这样是否可以级联的更新进contract表中呢?设置 inverse="true" 表示对方管理关系 cascade="all" 表示级联更新结果当person更新时也对集合处理
如果想设置person里的set延迟加载,lazy设为true和extra都可以
只不过extra更智能化一点,设为extra查询所有记录时会自动发出select count(*)的语句
person.getContracts().get(0)时候,hibernate知道你要用到contracts了,当然会乖乖地查来给你了。要不然,就不叫lazy,应该叫不听使唤了!!!
其实不光是一对多。在你Person person = dao.get(id)等到一个实例的时候,这个时候也是lazy,实际上他只给你了一个代理类,里面只有id有值,其他属性一律为空。但你调用person.getXXX(),或是调用person.setXXX()的时候,就能得到或是修改。是一个道理的。