Hibernate学习④:关联关系

一、关联【association】

1、含义:指的是类之间的引用关系,如果类A与类B关联,那么被引用的类B将被定义为类A的属性
2、分类:
①一对一
②一对多
③多对一
④多对多

说明:关联是有方向的

二、级联新增

1、外键处理的三种方法:
(1)删除从表对应的实体类中的外键属性
(2)在配置的xml中外键属性上添加
(3)在配置的xml中的many-to-one标签中添加

2、Casecade【用来控制如何操作关联的持久化对象的】
①None : 保存,更新或删除当前对象时,忽略其他关联的对象
②Save-update : 保存,更新时级联保存所有的临时对象,并且级联更新关联的游离对象
③Delete : 通过session的delete方法删除当前对象,级联删除关联的对象
④All : 等于save-update操作+delete操作
测试①

@Test
	//增加订单项
	public void testAddOrderItem() {
		OrderItem orderItem = new OrderItem();
//		orderItem.setOid(7);
		orderItem.setPirductId(34);
		orderItem.setQuantity(78);
		Order order = new Order();
		//要保证主表中有该数据
		order.setOrderId(6);
		orderItem.setOrder(order);
		this.orderDao.addOrderItem(orderItem);
		
	}

测试②

//增加订单
	public void testAddOrder() {
		Order order = new Order();
		order.setOrderNo("p8");
		OrderItem orderItem;
		for (int i = 1; i < 7; i++) {
			orderItem = new OrderItem();
			orderItem.setPirductId(i);
			orderItem.setQuantity(i);
			//双向绑定
			order.getOrderItems().add(orderItem);
			orderItem.setOrder(order);
		}
		this.orderDao.addOrder(order);
	}

三、级联查询

//设置是否懒加载
		if(o != null && new Integer(1).equals(order.getInitOrderItems())) {
			Hibernate.initialize(o.getOrderItems());
		}

dao①

	//查询单个订单
	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.getInitOrderItems())) {
			Hibernate.initialize(o.getOrderItems());
		}
		transaction.commit();
		session.close();
		return o;
	}

dao②

//查询所有订单
	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;
	}

四、普通删除

先删除从表,再删除主表
Dao

//删除订单以及对应订单项
	public void delOrder(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();
	}

五、补充

1、insert属性设置中主控方概念理解
①Lazy : true (默认) ——>延迟加载
False ——>立即加载(影响查询性能)

②outter-join : true ——>使用左联接查询关联(性能不高)
			 False(默认)

③inverse  :true  ——> 将对方设置为主控方(一对多,可以减少sql语句数量,减少多余操作)
			False (默认)

2、【一对多双向关联】关系建立 ----订单与订单项
order.hbm.xml

	
    		<!-- 
    			cascade:用来配置维护实体类的关系所用
    			inverse:关系交由反方控制
    		 -->
    		<set  name = "orderItems" cascade = "save-update" inverse = "true">
	    		<!-- 填外键 -->
	    		<key column = "oid"></key>
	    		<one-to-many class = "com.zking.four.entity.OrderItem"></one-to-many>
    		</set>

3、【多对一双向关联】关系建立

<many-to-one name = "order" class = "com.zking.four.entity.Order" column = "oid"></many-to-one>

说明:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43163062/article/details/83314667
今日推荐