hibernate(四)一对多关联

案例:级联新增、级联查询

注意:在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()
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值