最近学习hibernate,让hibernate的关联问题整得晕头转向
假设有以下例子
Qx(区县)和Jd(街道)public  class Qx implements java.io.Serializable {
// Fields
private Integer qxid;
private String qxname;
private Set<Jd> jds=new HashSet<Jd>();
       ....相应的get和set方法
}
public class Jd  implements java.io.Serializable {
// Constructors
/** default constructor */
private int jdid;
private String jdname;
private Qx qx;
     ...相应的get和set方法
}问题来了
坦白讲,我对hibernate这种Qx里加Set<Jd>和Qx里加Jd感到差异,因为我用纯jdbc或者ibatis处理以下情况时,做法是Qx里不加Set,而Jd里加的不是Qx对象,而是qxid(Qx的主键)
hibernate的思想是应该是:
增删改查Qx时,通过Qx可以增删改查Jd(通过Qx对象的setJds呀)
增加吧:
如果qx没有setJds,那么jds就是null了
所以这个时候,应该不关联
但是qx.setJds时。。我们想它应该给我们添加上。。这时候应该关联..
但是因为它是setJds的,原先的jds岂不是没了?
你们能理解我的意思吗?很乱。。
再比如:
qx.setJds<jds>
万一这里面有个jd对象自己setQx了还不是上面那个qx,这个时候保存哪个呢
你们能理解我吗?我对hibernate关联这块好乱。。
你们帮帮我吧 

解决方案 »

  1.   

    hibernate的一对多,多对一是很好用的,也很好理解。
    你说的问题我感觉就应该是在操作一个对象的数据时是否同时查第二个对象的数据,你说的比较乱,我没有看明白,目前理解只能这样。
    在你生成hibernate映射文件时,一对多或多对一的有一个属性为lazy,意思为延迟加载,比如在查第一个对象的数据时,如果lazy设置为true,那么当你不调用第二个对象的任何数据时,hibernate是不会查它的。
    这个lazy要按照你的需求去设置。还有一个属性是cascade,这是级联操作,意思是是否在操作第一个对象是同时对第二个对象进行操作。
    我也说不明白,最近我也正在研究hibernate,感觉hibernate还是很好的。
    有主外键关系的一定要在数据库中声明。你生成的那个都是po对象,应该有set。
      

  2.   

    比如说商品和类型,多个商品对应一个类型
    inverse的意思是主控权的问题   这一般都设置在一对多中一的那一面  可以设置为true或者false   设置没false时代表我是主控方,我有权利操作你的数据。比如说delete,如果你设置为true,说明多的那一方让出主动权,我在删除一个类型时,我不能删除多个商品。如果设置为false,代表在删除类型时,就可以删除商品,因为主控权在类型的手里,可以随意更改商品的数据。
    cascade的值都有all  none  save-update  delete
    all:在操作一方数据时同时操作另一方的数据
    none: 在操作一方数据时 不会影响到其他数据
    save-update: 只有在添加和修改的时候在会影响到其他数据
    delete: 只有在删除时才会影响其他数据
    按照需求设置
      

  3.   

    也就是说,如果invser是false,那么cascade就没有用了是吧?