【Hibernate框架】使用链接表的关联映射(一对多/多对一、单/双向映射)


马上就进入hibernate关联映射总结的最后阶段了,关于使用链接表的关联映射。

回顾我们的上篇文章【Hibernate框架】关联映射(多对多关联映射),我们总结了有关多对多关联映射的一些知识,细心的朋友们大家可能都发现了,在这部分内容中,我们添加了第三张表链接表来存放我们两个对象之间之间的对应关系,这也就是链接表的概念了。对于我们的一对多、多对一映射中,很多时候我们也需要使用这种链接表来完成一些东西,又该如何配置呢?

首先我们就利用上篇文章的例子为引,分析一下有关使用链接表的一对多、多对一单向关联映射:

特定场景:现在实行限购了,一个人只可以拥有一套房,一套房能住很多人。

房子与住房子的人的关系,是一对多的关系。

Po对象:Person.java

public class Person{
      private int id;
      private String name;
      //getter、setter   
}
Address.java

public class Address{
      public int id;
      public String name;
      public Set<Person> persons;
      //getter、setter
}

映射文件:Person.hbm.xml
<hibernate-mapping package="org.hibernate.test">  
    <class name="com.ssh.hibernate.Person" table="t_person">  
        <id name="id">  
        <generator class="native"/>  
    </id>  
    <property name="name"/> 
    </class>  
</hibernate-mapping>

Address.hbm.xml

<hibernate-mapping package="org.hibernate.test">  
    <class name="com.ssh.hibernate.Address" table="t_address">  
        <id name="id">  
            <generator class="native" />  
        </id> 		
        <property name="name" />
	<set name="person" table="t_personAdress">
	    <key column="addressId">
            <many-to-many column="personId" class="com.ssh.hibernate.Person" unique="true"/>
	</set>
    </class>  
</hibernate-mapping>

其实大家可以看得出来,所谓的单向的一对多的配置,其实就是多对多配置上在set many-to-many加了一个unique="true",设置成唯一,这样所谓的多(唯一了)对多不就成了一对多了吗?


对于多对一呢?好几个人住一套房不就是多对一吗?

Po对象:Person.java

public class Person{
      private int id;
      private String name;
      private Adress adress;
      //getter、setter
}
Address.java

public class Address{
      private int id;
      private String name;
      //getter、setter
}
映射文件:Person.hbm.xml

<hibernate-mapping package="org.hibernate.test">  
    <class name="com.ssh.hibernate.Person" table="t_person">  
        <id name="id">  
	    <generator class="native"/>  
	</id>  
	<property name="name"/>
	<join table="t_personAddress" optional="true"> 
	    <key column="personId" unique="true"/>
	    <many-to-one name="address" column="addressId" not-null="true">
	</join>
    </class>  
</hibernate-mapping> 

Address.hbm.xml

<hibernate-mapping package="org.hibernate.test">  
    <class name="com.ssh.hibernate.Address" table="t_address">  
        <id name="id">  
            <generator class="native" />  
        </id> 		
        <property name="name" />
    </class>  
</hibernate-mapping>  



同样使用上面场景,实现一对多/多对一双向映射。

Po对象:Person.java

public class Person{
      private int id;
      private String name;
      private Address address;
      //getter、setter
}

Address.java

public class Address{
      private int id;
      private String name;
      private Set<Person> persons;
      //getter、setter
}

配置文件:Person.hbm.xml

<hibernate-mapping package="org.hibernate.test">  
    <class name="com.ssh.hibernate.Person" table="t_person">  
        <id name="id">  
	    <generator class="native"/>  
	</id>  
	<property name="name"/>
	<join table="t_personAddress" inverse="true" optional="true"> 
	    <key column="personId"/>
	    <many-to-one name="address" column="addressId" not-null="true">
	</join>
    </class>  
</hibernate-mapping>  


Address.hbm.xml

<hibernate-mapping package="org.hibernate.test">  
    <class name="com.ssh.hibernate.Address" table="t_address">  
        <id name="id">  
            <generator class="native" />  
        </id> 		
        <property name="name" />
	<set name="person" table="t_personAddress">
	    <key column="addressId">
	    <many-to-many column="PersonId" unique="true" class="com.ssh.hibernate.Person">
	</set>
    </class>  
</hibernate-mapping>


简单的配置一下就ok了,这里我们就不再测试了,有兴趣的自己test一下吧!


总结:

       从上面可以总结出,一对多是多对多的特殊或者是范围内的特例,我们只需要在多对多里面设置unique=true来限制唯一就可以达到由多对多到一对多的完美转变



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值