欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate关联关系映射( ORM)

程序员文章站 2022-04-22 18:03:49
...
  • 单向关联
  • 双向关联
  • 使用连接表的双向关联

Hibernate关联关系映射( ORM)


一、ORM

Hibernate入门https://blog.csdn.net/qq_35206244/article/details/81281651
首先要了解几点,Hibernate实体映射技术及其设计上的一些通用策略。
对于ORM而言,一个非常关键的特性,就是实体之间关联关系的管理。
数据关联是ORM的一个重要特征

二、单向关联

在一方维护关联信息,在另一方不做处理。
如何理解?在实际应用中往往需要根据查询到的结果获得相关的其他持久化的数据,例如从用户信息中得到与该用户所关联的订单,或从订单中得到订购者的信息。
如果采用的是单向关联,那么这种关联导航就只是一方对象所拥有的能力。比如,在用户信息中维护一个订单列表就可以获取与该用户关联的所有订单,但是从订单的角度来说,就不能获得用户的信息。

2.1、单向many-to-one关联

订单中保存用户信息:(多方维护关联信息)

public class order{
private int orderId;
private Customer customer;
private String orderDate;

映射定义

<class name="com.it.demo.hiberenate.demo.relation.entity.Order" table="orderlist" lazy="false">
    <id name="orderId">
        <generator class="native"/></id>
        <property name="orderDate" insert="false" update="false"/>
        <many-to-one name="customer" column="customerId" not-null="true"/>
        </class>

many-to-one属性

  • name:设定待映射的持久化类的属性名
  • column:设定和持久化类的属性对应的表的外键,此处为orderlist表的外键customerId
  • not-null:如果为true,表示customer属性不允许为空,该属性的默认值为false
    订单中保存用户信息(多方维护关联信息):
  • public List<Order>getOrderList(){
    Session ses = HibernateUtil.getCurrentSession();
    Transaction tx = ses.beginTransaction();
    List<Order> result = ses.createCriteria(Order.class).list();
    tx.commit();
    return result;
    }
    ......
    public void addOrderList(String cid,Order ord){
    Session ses = HibernateUtil.getCurrentSession();
    Transaction tx = ses.beginTransaction();
    Customer customer = (Customer)ses.load(Customer.class,cid);
    ord.setCustomer(customer);
    ses.save(ord);
    tx.commit();
    }

    用户信息中维护订单的列表(一方维护关联信息):

    public class Customer{
    private String customerId;
    private Sting customerName;
    pirvate List orders;
    ....

    映射定义

    <class name="com.it.demo.hibernate.demo.entity.Custome" table="customerId"/>
        <id name="customerId"/>
        <property name="customerName"/>
        <bag  name="orders">
            <key column="customerId" not-null="true"/>
            <one-to-many class="com.it.demo.hibernate.demo.entity.Order"/>
        </bag>
    </class>

    三、双向关联

    3.1、双向关联:在关联的两方同时维护关联信息

    如果采用的是单向关联,那么这种关联就是关联双方所拥有的能力。比如,既可以在用户信息中获取与该用户关联的所有订单,又能够从订单的角度来获得用户的信息。
    双向(many-to-one)(one-to-many)关联是一种最常见的关联关系,也是标准的父子关联关系

    <class name="com.it.demo.hibernate.demo.relation.entity.Order" table="orderlist" lazy="false">
        <id name="orderId">
        <generator class="native"/>
        </id>
        <property name="orderDate" insert="false" update="false"/>
        <many-to-one name="customer" column="custormerId" not-null="true"/>
    </class>
    ...
    public class Order{
    private int orderId;
    private Customer customer;
    private String orderDate;
    ...
    
    
    <class name="com.it.demo.hibernate.demo.relation.entity.Customer" table="customer">
    <id name="customerId"/>
    <property naem="customerName"/>
    <bag name="order" inverse="true">
        <key column="customerId" not-null="true"/>
        <one-to-many class="com.it.demo.hibernate.demo.relation.entity.Order"/>
        </bag>
        </class>
        ...
    public class Customer{
    private String customerId;
    private String customerName;
    private List orders = new LinkedList();
    ...
    

    四、使用连接表的双向关联

    在设计数据库模型时,当实体对象之间存在多对多的关联情况(例如:一个用户群中包含多个用户,同时一个用户又可以参见多个用户群),往往会采用增加一张关联表的方式,将多对多的关联分解为两个一对多的关系。
    例如在用户和用户组之间增加一个用户分组表:一个用户ID在用户分组表中可以出现多次(用户可以属于多个用户组),而用户组ID也可以出现多次(当用户组中包含多个用户)

    <class name="com.it.demo.hibernate.demo.relation.entity.Customer"
    table="customer">
        <id name="customerId"/>
        <property name="customerName"/>
        <bag name="orders" inverse="true">
        <key column="customerId" not-null="true"/>
        <one-to-many class="com.it.demo.hibernate.demo.entity.Order"/>
        </bag>
        <!--使用连接表的多对多设置-->
        <bag name="groups" table="customerGroup">
        <key column="customerId"/>
        <many-to-many column="groupId" class="com.it.demo.hibernate.demo.entity.Group"/>
        </bag>
        </class>
    <class name="com.it.demo.hibernate.demo.entity.Group" table="groups">
    <id name="groupId">
    <generator class="native"/>
    </id>
    <property name="groupName"/>
    <!--使用连接表的多对多设置-->
    <bag name="customers" table="customerGroup">
    <key column="groupId"/>
    <many-to-many column="customerId" class="com.it.demo.hibernate.demo.entity.Customer"/>
    </bag>
    </class>
    public class Customer{
    private Stirng customerId;
    private String customerName;
    private List orders=new LinkedList();
    private List groups = new LinkedList();
    public class Group{
    private int groupId;
    private String groupName;
    
    private List customers = new LinkedList();

    五、总结

    • 单向关联
      • 一对多关联
      • 多对一关联
    • 双向关联
      • 一对多关联
    • 使用连接表的双向关联
      • 多对多关联