Hibernate(6) 一对多映射关系的建立

版权声明:转载需经同意,谢谢! https://blog.csdn.net/Big_KK/article/details/82051897

1.一对多的映射关系的建立

很多时候。我们在对数据库进行更改的时候,除了会操作单独的一个表,跟多的是会操作多个表,并且表与表之间也会通过外键进行关联,而Hibernate同样可以帮助建立这样的多表关系并对数据库进行级联操作。首先来讲,表与表之间可以存在一对一,一对多,多对多的关系,其中1~N, M~N关系的举例说明可以用如下的图进行表示:
这里写图片描述
图示的这两种关系并不难理解,而如何在Hibernate里面建立这一对多的关系呢?


如之前所讲的一样,想要建立一对多的关系,首先就是要先创建所需要的实体类,在这里就延伸图示的例子。建立表示消费者的Customer实体以及表示收获地址的Address实体。接下来将为这两个实体建立一对多的关系,其中消费者Customer是1端,地址是N端。

1.建立所需要的实体,并设置属性以及get/set方法

  1. 首先按照实体类的相关约定建立就可以了。需要注意的是,每个实体类都必须存在一个与所映射表的主键相对应的“特殊”属性。这一步与之前采用一对一关系所使用的步骤相同。
  2. 为了建立一对多的关系,需要在各个实体类里面添加他们所对应的实体作为他们的一个属性。 结合本例:
    个消费者可以存在多个收货地址,但是具体的一个收货地址只能为一个消费者所有。所以需要在消费者里面设置表示地址的实体作为它的一个属性,又因为消费者会对应多个地址,所以这个实体需要设置为Set集合(无序,可重复性的)的形式。

    样的,表示地址的实体需要对应唯一的一个用户,所以需要在地址实体里面添加消费者实体作为它的一个属性,表示这个地址实体所对应的消费者
    最终实体的建立结果如下,为减少篇幅,省略了get/set方法:

表示消费者的实体:
    private int id;
    private String name;
    private Set<Address> addressSet = new HashSet<Address>();//表示该消费者所对应的所有地址
表示地址的实体:
    private int id;
    private String address;
    private Customer customer;//表示该地址所对应的消费者

2.为实体建立映射文件,建立映射关系

  1. 添加与数据库表的映射,并指定实体的哪个属性(上文提到的“特殊”属性)与数据库的组件对应,设置主键增长策略以及其它普通属性的映射。这一步与之前一对一的关系配置映射关系的过程还是一样的。主要的区别在下面:
  2. 在1端(消费者实体),按照第一步配置完毕之后,还需要将该实体与N端(地址实体)联系起来,方法如下:
    仍旧在class标签里面,使用set标签,配置它对应N端的实体的关系:
//省略dtd文件头...
<hibernate-mapping>
    <class name="com.bestbigkk.domain.Customer" table="tb_customer">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>
        <property name="name" column="name"></property>

        <!--
            set标签的属性name表示: 1端的实体(Customer实体)的哪个属性 对应N端的实体(Address实体),在这里customer实体内部设置的是addressSet集合对应地址实体的内容
            set的标签里面需要指定:
                key标签:属性column表示这个1对多关系中,实体的外键名字。本例中是为Customer以及Address设置1对多关系,外键存在于Address实体,外建名:customer_1toN_address。
                因为Hibernate使用了双向绑定的机制,所以虽然现在是在1端,但还是要把位于N端的外键名称写出来
                one-to-many标签:表示当前实体是1端,而class属性就是当前的1端实体所指向的N端实体的全路径,本例中,Customer实体指向Address实体。
        -->
        <set name="addressSet">
            <!--若不设置,会产生不正确的映射关系-->
            <key column="customer_1toN_address"></key>
            <one-to-many class="com.bestbigkk.domain.Address"></one-to-many>
        </set>
    </class>
</hibernate-mapping>

      3.在N端(地址实体)配置地址实体与消费者实体对应的关系:


<hibernate-mapping>
    <class name="com.bestbigkk.domain.Address" table="tb_Address">
        <id name="id" column="id">
            <generator class="native"></generator>
        </id>
        <property name="address" column="address"></property>

        <!--
        使用many-to-one标签进行配置,表示该实体是N端。
        属性name表示的是当前实体中的哪个属性对应1端实体,这里设置的属性是customer
        属性class表示当前实体所对应的实体类的全路径,这里Address实体对应Customer实体,因此使用Customer的全路径
        属性column表示当前这个1对多关系中的外键名称,在Customer与Address建立一对多关系的示例中,所用的外键名为:customer_1toN_address
        -->
        <many-to-one name="customer" class="com.bestbigkk.domain.Customer" column="customer_1toN_address"></many-to-one>
    </class>
</hibernate-mapping>

      4.以上就是实体配置与表的映射关系并且实体之间建立1对多的关系,接下来需要在Hibernate的核心配置文件里面引入以上所编写的映射文件:

        <mapping resource="com/bestbigkk/domain/Address.hbm.xml"></mapping>
        <mapping resource="com/bestbigkk/domain/Customer.hbm.xml"></mapping>

此时可以进行单元测试查看一对多的映射关系是否建立完成,写一个简单的测试来查看下结果,因为只是为了查看映射结果是否建立,所以就没有对表进行任何操作

可以在SQLYog里面新建一个架构设计器来查看执行的结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Big_KK/article/details/82051897