1. 什么是关联(association)
1.1 关联指的是类之间的引用关系。如果类A与类B关联,那么被引用的类B将被定义为类A的属性。
例如:
t_hibernate_order
t_hibernate_order_item
一个订单对应多个订单项
class Order{
private List<OrderItem> orderItems;
}
class OrderItem{
private Order order;
}
class B{
private String name;
}
public class A{
private B b = new B;
public A(){}
}
hibernate:orm框架、以面向对象的思想操作数据库
实体类–》表
属性–》字段
1.2 关联的分类:关联可以分为一对一、一对多/多对一、多对多关联
关联是有方向的
订单表、订单项表
select * from t_order t,t_orderItem m where t.oid = m.oid
and .....
class Order{
private STIRNG OID;
...
private Set<OrderItem> OrderItems;
}
session.get(Order.class,1)
注意:
1. 关键点都在数据库中的外键上面,请好好理解下面这二句SQL和一对多及多对一的关系
2. select * from Orders where cid=? //这条SQL返回客户对应的0-n个订单
3. select * from Customers where customerId=? //这条SQL返回订单对应的1个客户
4. 通过这二条SQL不难看出,外键在这里有二个用途:查找客户的订单,查找订单对应的客户
Entity包:
建立客户到订单的一对多关联关系
<set lazy="true" name="orderItems" cascade="save-update" inverse="true">
<key column="oid"></key>
<one-to-many class="com.qiuwenfan.three.entity.OrderItem" />
</set>
Order.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.qiuwenfan.three.entity.Order" table="t_hibernate_order">
<id name="orderId" type="java.lang.Integer" column="order_id">
<generator class="increment" />
</id>
<property name="orderNo" type="java.lang.String" column="order_no">
</property>
<!--
bag标签
name:当前要映射的类的关联属性
cascade:维护关联关系
inverse:决定由谁来维护关联关系
key标签
column:表的外键对应的列段
one-to-many
class:关联属性对应的类的全路径名
-->
<bag name="orderItems" cascade="save-update" inverse="true">
<key column="oid"></key>
<one-to-many class="com.qiuwenfan.three.entity.OrderItem"></one-to-many>
</bag>
</class>
</hibernate-mapping>
Order.java:
package com.qiuwenfan.three.entity;
import java.util.ArrayList;
import java.util.List;
public class Order {
private Integer orderId;
private String orderNo;
private List<OrderItem> orderItems = new ArrayList<OrderItem>();
private Integer initChildren = 0;//0代表默认懒加载,1代表强制加载
public Integer getInitChildren(