`
ixiaojin
  • 浏览: 20010 次
  • 性别: Icon_minigender_1
  • 来自: 大连
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate关联关系(2)

    博客分类:
  • Java
阅读更多

2、双向关联

 

双向关联在两端都知道对方的存在,同时也是由“一对多”和“多对一”两个关联关系组合而成的。在实现上也就是说,POJO的两个类里面都要有一个属性来保存对方的值。

 

public class Message {

    private int msgId;

    private String ttl;

    private String desc;

    private Date date;

private UserInfo user;

 

 

这时要在“多”的一端加上<many-to-one>节点,

<many-to-one name="user" class="xiaojin.hibernate.entity.UserInfo" column="usr_id" cascade="none"></many-to-one>

其中个属性

name:标明关联的一端

column:外键

cascade:是指级联操作

在“一“的一端配置:

<set name="messages" order-by="usr_id" cascade="all" inverse="true" >

          <key column="usr_id" />

          <one-to-many class="xiaojin.hibernate.entity.Message" />

 </set>

可以看到这里加了一个属性inverse="true"  意为反转,在双向关联中inverse="false" 的一方为主动方负责维护关联关系,默认值为false

在上述配置中,主动方在message一方,也就是说在message持久化过程中,message会主动去获取相关的user 对象的usr_id 作为自己的外键usr_id

 

关于级联操作:

级联操作是通过cascade来进行配置的。

从常识来讲对于级联的操作主动方都应该是以的一段的,举个例子来讲,当我们要删除一条message时是不允许其删除与之相关联的user的,然而当删除一个user必要将与其相关的message删除掉。在上面的配置中cascade="none"就是为了这个需求,当然在实际情况下还要同需求相联系来具体设置,hibernate的配置还是很灵活的。

 

测试方法:

    public static void saveMessagesAndUser(){

        UserInfo user= new UserInfo();

        user.setName("xiaofei");

        user.setPassword("xiaofei");

       

        Set<Message> msgs = new HashSet<Message>();

       

        Message msg = new Message();

        msg.setTtl("msg_xiaofei");

        msg.setDesc("desc");

    

        msgs.add(msg);

      

        user.setMessages(msgs);

        msg.setUser(user);

    

        save(user);       

}

 

注意上面加粗的两行,这时我们用的已经是双向关联了!

 

关于在应用中是应该使用单行关联还是双向关联:

hibernate的建议是使用双向关联。

关于一对多还是多对一:

多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一

一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

也就是说一对多和多对一的映射策略是一样的,只是站的角度不同

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics