课程目标
1.一对多的关联配置
数据库:主表从表,通过外键关联
2.懒加载
3.一对多的自关联
4.多对多的关联
一、一对多的关联配置
1、关联指的是类之间的引用关系。
假设有类A与类B,如果AB关联,A引用B,那么被引用的类B将被定义为类A的属性。
2、一对多的关联:
例如:订单和订单项,一个订单有多个订单项;
但是一个订单项只有一个订单;
3、创建实体类和映射文件
①、实体类:
(1)Order
package com.lj.two.entity;
import java.util.HashSet;
import java.util.Set;
public class Order {
// create table t_hibernate_order
// (
// order_id int primary key auto_increment,
// order_no varchar(50) not null
// );
private Integer orderId;
private String orderNo;
//注意:变量属性一定用接口进行接受
private Set<OrderItem> orderItems = new HashSet<>();
private Integer initOrderItems = 0;//0代表懒加载,1代表强制加载
public Integer getInitOrderItems() {
return initOrderItems;
}
public void setInitOrderItems(Integer initOrderItems) {
this.initOrderItems = initOrderItems;
}
public Set<OrderItem> getOrderItems() {
return orderItems;
}
public void setOrderItems(Set<OrderItem> orderItems) {
this.orderItems = orderItems;
}
public Integer getOrderId() {
return orderId;
}
public void setOrderId(Integer orderId) {
this.orderId = orderId;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
}
(2)OrderItem
package com.lj.two.entity;
public class OrderItem {
// create table t_hibernate_order_item
// (
// order_item_id int primary key auto_increment,
// product_id int not null,
// quantity int not null,
// oid int not null,
// foreign key(oid) references t_hibernate_order(order_id)
// );
private Integer orderItemId;
private Integer productId;
private Integer quantity;
private Integer oid;
private Order order;
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
public Integer getOrderItemId() {
return orderItemId;
}
public void setOrderItemId(Integer orderItemId) {
this.orderItemId = orderItemId;
}
public Integer getProductId() {
return productId;
}
public void setProductId(Integer productId) {
this.productId = productId;
}
public Integer getQuantity() {
return quantity;
}
public void setQuantity(Integer quantity) {
this.quantity = quantity;
}
public Integer getOid() {
return oid;
}
public void setOid(Integer oid) {
this.oid = oid;
}
}
②、映射文件:
(1)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.lj.two.entity.Order" table="t_hibernate_order">
<id name="orderId" type="java.lang.Integer" column="order_id">
<generator class="increment"></generator>
</id>
<property name="orderNo" type="java.lang.String" column="order_no"/>
<!--
cascade:级联属性配置
inverse:关联关系交给对方维护吗?
-->
<set name="orderItems" cascade="save-update" inverse="true">
<key column="oid"></key>
<one-to-many class="com.lj.two.entity.OrderItem"/>
</set>
</class>
</hibernate-mapping>
对于订单来说属于一对多 使用标签one-to-many class为订单项的全限定名
name属性是属性名 key表示外键
(2)OrderItem.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.lj.two.entity.OrderItem" table="t_hibernate_order_item">
<id name="orderItemId" type="java.lang.Integer" column="order_item_id">
<generator class="increment"></generator>
</id>
<property name="productId" type="java.lang.Integer" column="product_id"/>
<property name="quantity" type="java.lang.Integer" column="quantity"/>
<property name="oid" type="java.lang.Integer" column="oid"/>
<!-- Repeated column in mapping for entity: com.zking.four.entity.OrderItem column: oid (should be mapped with insert="false" update="false") -->
<many-to-one name="order" class="com.lj.two.entity.Order" insert="false" update="false" column="oid"></many-to-one>
</class>
</hibernate-mapping>
核心配置文件(hibernate.cfg.xml)
<!-- 一对多 -->
<mapping resource="com/lsy/two/entity/Order.hbm.xml" />
<mapping resource="com/lsy/two/entity/OrderItem.hbm.xml" />
工具类
package com.lj.two.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Config