文章目录
  1. 1. 单向N-1关联
    1. 1.1. 域模型
    2. 1.2. 关系数据模型
  2. 2. Demo

我最近在复习一下关于Hibernate关系映射的知识,看了书本的介绍以及视频。这几篇博客都是对学到知识的一点总结。当然,这些这是最基本的能够实现关联关系的配置,在实际的使用中,还有很多参数需要根据情况来设置。但也算是对以后开发过程中遇到遗忘的地方可以进行查阅。

在本文中使用的Demo也都已经上传到github中,里边有详细的运行说明。
Hibernate关系映射1:单向N-1关联
Hibernate关系映射2:双向1-N关联
Hibernate关系映射3:双向1-1关联
Hibernate关系映射4:N-N关联

Github地址:HibernateRelationMapping

单向N-1关联


单向N-1关系,比如多个人对应一个地址,只需从人实体端可以找到对应的地址实体,无须关系某个地址的全部住户。

单向 n-1 关联只需从 n 的一端可以访问 1 的一端。

域模型

从 Order 到 Customer 的多对一单向关联需要在Order 类中定义一个 Customer 属性, 而在 Customer 类中无需定义存放 Order 对象的集合属性
图1

关系数据模型

ORDERS 表中的 CUSTOMER_ID 参照 CUSTOMER 表的主键
图2

Demo

Hibernate 使用 元素来映射多对一关联关系
<many-to-one name="customer" class="Customer" column="CUSTOMER_ID" cascade="all" />

  • name: 设定待映射的持久化类的属性的名字
  • column: 设定和持久化类的属性对应的表的外键
  • class:设定待映射的持久化类的属性的类型
  • cascade:意味着系统将先自动级联插入主表记录,也就是说先持久化Customer对象,再持久化Person对象。开发时不建议使用该属性,建议使用手工的方式。

下面是实体对象,分为Customer(顾客)和Order(订单),其中订单和顾客是N-1关系。

1
2
3
4
5
6
7
8
9
10
11
public class Customer {
private Integer customerId;
private String customerName;
//省去get和set方法
}
public class Order {
private Integer orderId;
private String orderName;
private Customer customer;
//省去get和set方法
}

Customer.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
<hibernate-mapping>
<class name="com.lihui.hibernate.single_n_1.Customer" table="CUSTOMERS">
<id name="customerId" type="java.lang.Integer">
<column name="CUSTOMER_ID" />
<generator class="native" />
</id>
<property name="customerName" type="java.lang.String">
<column name="CUSTOMER_NAME" />
</property>
</class>
</hibernate-mapping>

Order.hbm.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<hibernate-mapping package="com.lihui.hibernate.single_n_1">
<class name="Order"
table="ORDERS">

<id name="orderId" type="java.lang.Integer">
<column name="ORDER_ID" />
<generator class="native" />
</id>
<property name="orderName" type="java.lang.String">
<column name="ORDER_NAME" />
</property>
<many-to-one name="customer" class="Customer" column="CUSTOMER_ID" cascade="all" />
</class>
</hibernate-mapping>

Junit Test
由于在Order.hbm.xml中配置了cascade="all",所以只需要保存order对象即可,会首先自动保存级联的Customer对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void testSave() {
Customer customer = new Customer();
customer.setCustomerName("a");

Order order1 = new Order();
order1.setOrderName("A");
order1.setCustomer(customer);
Order order2 = new Order();
order2.setOrderName("B");
order2.setCustomer(customer);

session.save(order1);
session.save(order2);
}

文章目录
  1. 1. 单向N-1关联
    1. 1.1. 域模型
    2. 1.2. 关系数据模型
  2. 2. Demo