免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1567 | 回复: 0
打印 上一主题 下一主题

Hibernate中的关联操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-12 22:06 |只看该作者 |倒序浏览

                                                一对一:
例:Room和Door一对一,Room为主控方
Hibernate不会帮你生成one to one的xml,需要自己改动,主要是主控方的xml后面加上
               
               
                 one-to-one name="door" class="cn.hh.hibernate.Door" cascade="save-update" constrained="false"/>
这里的name=""是主控方通过它来拿被控方的door属性,即getDoor()方法,所以一定要和被控方的javabean中属性对应,被控方对主控方也一样。
被控方的主键又主控方的主键生成
        id name="tdId" type="java.lang.String">
            column name="TD_id" length="32" />
            generator class="foreign" >
                param name="property">room/param>
            /generator>
        /id>
one-to-one name="room" class="cn.hh.hibernate.Room" constrained="true" cascade="none" />
区别与主控方cascade和constrained的不同
由于是一对一的关系,Hibernate给我们生成的javabean内主控方内的被控方属性是一个Set,需要把它改为被控方的类型,这里是Door
    // Fields
    private String id;
    private String name;
    private String description;
    private Door door; //原来是 private Set doors;
Test.java  (save操作)
        Session session = HibernateSessionFactory.getSession();
        Transaction trans = session.beginTransaction();
        Room room = new Room();
        room.setName("room1");
        room.setDescription("description");
        
        Door door = new Door();
        door.setName("door1");
        door.setDescription("description");
        
        room.setDoor(door);  //***(1)
        door.setRoom(room);  //***(2)
        
        session.save(room);
        trans.commit();
        session.close();
如果主控方的cascade是all或save-update,且(1)、(2)都写了,则保存room时候,door也会保存,如果只写了(1),door不会保存,只写(2)会出错,因为door需要room的id。
如果cascade是none或者delete,则door不会被保存。
一对多:
例:billmain和billdetail一对多,Room为主控方,billdetail中bill_id是外键
主控方xml后加上
               
                                set name="billdetails" inverse="true" lazy="true" cascade="all">
            key>
                column name="bill_id" length="32" />
            /key>
            one-to-many class="cn.hh.hibernate.model.Billdetail" />
        /set>
name=""是和Billmain中的billdetails相对应,因为是Set,HIbernate自动给billdetail加了s
被控方的bill_id生成方式
                many-to-one name="billmain" class="cn.hh.hibernate.model.Billmain"     fetch="select">
            column name="bill_id" length="32" />
        /many-to-one>
Test.java  (save操作)
        Session session = HibernateSessionFactory.getSession();
        Transaction trans = session.beginTransaction();
        
        Billmain bm = new Billmain();
        bm.setName("mainName1");
        bm.setTotalCast(1000d);
        
        Billdetail bd1 = new Billdetail();
        bd1.setName("detailName1");
        bd1.setCost(500d);
        
        bm.getBilldetails().add(bd1);  //***(1)
        bd1.setBillmain(bm);  //***(2)
        
        session.save(bm);
        trans.commit();
        session.close();
这里操作和one to one相似
关于删除
一对'多'举例
如果主控方cascade为none或save-update,且存在'多',则主控方无法删除
如果cascade为all或delete,则主控方删除同时'多'也一起删除
unsaved-value属性 (对应使用sessin.saveOrUpdate()操作)
假如你设置了unsaved-value="10001",且generator class="uuid.hex"
在你的程序中自己定义了id为"10001",比如xxx.setId("10001") 这时hibernate会执行insert操作,但insert进去的id是uuid.hex生成的id,不是你设置的"10001"。
unsaved-value用的地方
比如你从数据库中load出一个user,同时把对应的news也都拿出来了,这时你又为user新添加了一个news,这时你保存数据,如果你unsaved-value="null",由于新news还没有id,正好和null对上,所以新news执行insert,其它执行update。
在这里感谢夏昕老师的《深入浅出Hibernate》,对我很大的启发。
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/53616/showart_441203.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP