案例:级联新增、级联查询
注意:在Hibernate当中定义实体对象的集合属性时,只能使用接口而不能使用类
数据库表:
// -- 订单表(主表)
// create table t_hibernate_order
// (
// order_id int primary key auto_increment,
// order_no varchar(50) not null
// );
// -- 订单项表(从表)
// 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)
// );
创建如下两个实体类:
order.java
package com.zking.four.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 initOrderItem = 0;//0代表懒加载 1代表立即加载
public Integer getInitOrderItem() {
return initOrderItem;
}
public void setInitOrderItem(Integer initOrderItem) {
this.initOrderItem = initOrderItem;
}
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;
}
public Order() {
super();
}
}
OrderItem.java
package com.zking.four.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;
}
public OrderItem() {
super();
}
}
Dao方法
package com.zking.four.dao;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.zking.four.entity.Order;
import com.zking.four.entity.OrderItem;
import com.zking.two.util.SessionFactoryUtils;
public class OrderDao {
public Integer addOrderItem(OrderItem orderitem) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Integer otid = (Integer) session.save(orderitem);
transaction.commit();
session.close();
return otid;
}
public Integer addOrder(Order order) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Integer oid = (Integer) session.save(order);
transaction.commit();
session.close();
return oid;
}
public Order getOrder(Order order) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Order o = session.get(Order.class, order.getOrderId());
if (o != null && new Integer(1).equals(order.getInitOrderItem())) {
Hibernate.initialize(o.getInitOrderItem());
}
transaction.commit();
session.close();
return o;
}
public List<Order> getOrderlist() {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
List list = session.createQuery("from Order").list();
transaction.commit();
session.close();
return list;
}
public void delete(Order order) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Order o = session.get(Order.class, order.getOrderId());
for (OrderItem ot : o.getOrderitems()) {
session.delete(ot);
}
session.delete(o);
transaction.commit();
session.close();
}
}
配置文件:
Order.hbm.xml
OrderItem.hbm.xml
Junit测试:
级联新增:
外键处理的三种方式
1、删除从表对应的实体类中的外键属性
2、在配置的xml中外键属性上添加 insert=false,update=false的设置。
3、在配置的xml中的manyToOne标签中添加insert=false,update=false的设置。
级联新增 casecade=save-update 介绍
解决:
级联查询:
配置文件介绍以及后台sql的形成过程
级联查询时的问题
Lazy=true介绍 查单个时存在问题
Lazy=false介绍 查所有时存在问题
解决方案:通过字段控制,强制加载。Hibernate.initialize()