马上就进入hibernate关联映射总结的最后阶段了,关于使用链接表的关联映射。
回顾我们的上篇文章【Hibernate框架】关联映射(多对多关联映射),我们总结了有关多对多关联映射的一些知识,细心的朋友们大家可能都发现了,在这部分内容中,我们添加了第三张表链接表来存放我们两个对象之间之间的对应关系,这也就是链接表的概念了。对于我们的一对多、多对一映射中,很多时候我们也需要使用这种链接表来完成一些东西,又该如何配置呢?
首先我们就利用上篇文章的例子为引,分析一下有关使用链接表的一对多、多对一单向关联映射:
特定场景:现在实行限购了,一个人只可以拥有一套房,一套房能住很多人。
房子与住房子的人的关系,是一对多的关系。
Po对象:Person.java
Address.javapublic class Person{ private int id; private String name; //getter、setter }
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
Address.javapublic class Person{ private int id; private String name; private Adress adress; //getter、setter }
映射文件:Person.hbm.xmlpublic class Address{ private int id; private String name; //getter、setter }
<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来限制唯一就可以达到由多对多到一对多的完美转变
【Hibernate框架】使用链接表的关联映射(一对多/多对一、单/双向映射)
最新推荐文章于 2022-10-06 20:46:11 发布