Hibernate关联(一对多增删改查)
Hibernate一对多一、介绍1. 什么是关联(association)1.1 关联指的是类之间的引用关系。如果类A与类B关联那么被引用的类B将被定义为类A的属性。#关键点都在数据库中的外键上面,请好好理解下面这二句SQL和一对多及多对一的关系#select * from Orders where cid? //这条SQL返回客户对应的0-n个订单#select * from Customers where customerId? //这条SQL返回订单对应的1个客户#通过这二条SQL不难看出,外键在这里有二个用途:查找客户的订单,查找订单对应的客户2. 案例:如何建立客户和订单一对多双向关联2.1 先不建立客户和订单的关联关系,定义实体及映射文件,单独执行保存操作2.2 建立客户到订单的一对多关联关系项目展示二、代码显示entity包Order.hbm.xml?xml version1.0 encodingUTF-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 namecom.DZY.three.entity.Order tablet_hibernate_order id nameorderId typejava.lang.Integer columnorder_id generator classincrement / /id property nameorderNo typejava.lang.String columnorder_no /property !--bag标签 name:当前要映射的类的关联属性 cascade:维护关联关系 inverse:决定由谁来维护关联关系 key标签 column:表的外键对应的列段 one-to-many: class:关联属性对应的类的全路径名 -- bag nameorderItems cascadesave-update inversetrue key columnoid/key one-to-many classcom.DZY.three.entity.OrderItem / /bag /class /hibernate-mappingOrderItem.hbm.xml?xml version1.0 encodingUTF-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 namecom.DZY.three.entity.OrderItem tablet_hibernate_order_item id nameorderItemId typejava.lang.Integer columnorder_item_id generator classincrement / /id property nameproductId typejava.lang.Integer columnproduct_id /property property namequantity typejava.lang.Integer columnquantity /property property nameoid typejava.lang.Integer columnoid insertfalse updatefalse /property !-- many-to-one:多对一的配置因为多个订单对应一个 订单 name:指的是当前所要映射的类com.DZY.three.entity.OrderItem的关联属性order Class:指的是关联属性的类别(全路径名 column:这里填的是外键 -- many-to-one nameorder classcom.DZY.three.entity.Order columnoid/many-to-one /class /hibernate-mappingOrderpackage com.DZY.three.entity; import java.util.ArrayList; import java.util.List; public class Order { private Integer orderId; private String orderNo; private ListOrderItem orderItems new ArrayListOrderItem(); private Integer InitChildren0;//0代表默认懒加载1代表强制加载 public Integer getInitChildren() { return InitChildren; } public void setInitChildren(Integer initChildren) { InitChildren initChildren; } 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 ListOrderItem getOrderItems() { return orderItems; } public void setOrderItems(ListOrderItem orderItems) { this.orderItems orderItems; } Override public String toString() { return Order [orderId orderId , orderNo orderNo , orderItems orderItems ]; } }OrderItempackage com.DZY.three.entity; public class OrderItem { 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; } }dao包DemoDaopackage com.DZY.three.dao; import java.util.List; import org.hibernate.Hibernate; import org.hibernate.Session; import org.hibernate.Transaction; import com.DZY.three.entity.Order; import com.DZY.three.entity.OrderItem; import com.DZY.two.util.SessionFactoryUtils; public class DemoDao { /** * 为了测试关系型映射文件配置准确 * 讲解insertfalseupdatefalse的用途 * param order * return */ public Integer addOrder(Order order) { Session session SessionFactoryUtils.openSession(); Transaction transaction session.beginTransaction(); Integer oid (Integer)session.save(order); transaction.commit(); session.close(); return oid; } public Integer addOrderItem(OrderItem orderItem) { Session session SessionFactoryUtils.openSession(); Transaction transaction session.beginTransaction(); Integer otid (Integer)session.save(orderItem); transaction.commit(); session.close(); return otid; } /** * 为了讲解懒加载的问题hibernate3.0后所有查询方式默认采用的是懒加载方式 * 1、查单个时存在问题代理对象已经关闭 * 2、查多个存在问题有性能的问题 * param order * return */ public Order getOrder(Order order) { Session session SessionFactoryUtils.openSession(); Transaction transaction session.beginTransaction(); Order o session.get(Order.class, order.getOrderId()); if(o ! null new Integer(1).equals(order.getInitChildren())) { Hibernate.initialize(o.getOrderItems()); // System.out.println(o.getOrderItems()); } transaction.commit(); session.close(); return o; } public ListOrder getOrderList() { Session session SessionFactoryUtils.openSession(); Transaction transaction session.beginTransaction(); ListOrder list session.createQuery(from Order).list(); transaction.commit(); session.close(); return list; } /** * z主表的数据不能随便删除得先删除从表中对应信息才能删除主表的信息。 * param order */ public void delOrder(Order order) { Session session SessionFactoryUtils.openSession(); Transaction transaction session.beginTransaction(); Order order2 session.get(Order.class, order.getOrderId()); for (OrderItem oi : order2.getOrderItems()) { session.delete(oi); } session.delete(order2); // session.delete(order); transaction.commit(); session.close(); } }SessionFactoryUtils;这个类需要话在我上一个作品里。上一个作品https://blog.csdn.net/qq_44224029/article/details/100152078通过JUnit Test case 获得下面个类。不懂怎么获取去看。DemoDaoTestpackage com.DZY.three.dao; import static org.junit.Assert.*; import java.util.ArrayList; import java.util.List; import org.junit.Test; import com.DZY.three.entity.Order; import com.DZY.three.entity.OrderItem; public class DemoDaoTest { private DemoDao demoDao new DemoDao(); Test public void testAddOrder() { Order order new Order(); order.setOrderNo(DZY); for (int i 0; i 6; i) { OrderItem oi new OrderItem(); oi.setProductId(10 i); oi.setQuantity(20 i); // demoDao.addOrderItem(oi) order.getOrderItems().add(oi); oi.setOrder(order); } demoDao.addOrder(order); } Test public void testAddOrderItem() { OrderItem oi new OrderItem(); oi.setProductId(55); oi.setQuantity(55); Order order new Order(); order.setOrderId(11); oi.setOrder(order); demoDao.addOrderItem(oi); } /** * 懒加载的问题hibernate3.0后所有查询方式默认采用的是懒加载方式 */ Test public void testGetOrder() { Order order new Order(); order.setOrderId(11); order.setInitChildren(1); Order odemoDao.getOrder(order); //failed to lazily initialize a collection of role: com.DZY.three.entity.Order.orderItems //could not initialize proxy - no Session System.out.println(o.getOrderNo()); System.out.println(o.getOrderItems().size()); } Test public void testGetOrderList() { ListOrder orderListdemoDao.getOrderList(); for (Order order : orderList) { System.out.println(order.getOrderNo()); // System.out.println(order.getOrderItems().size()); } } Test public void testDelOrder() { Order order new Order(); order.setOrderId(11); this.demoDao.delOrder(order); } }配置hibernate.cfg.xml?xml version1.0 encodingUTF-8? !DOCTYPE hibernate-configuration PUBLIC -//Hibernate/Hibernate Configuration DTD 3.0//EN http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd hibernate-configuration session-factory !--一对多 -- mapping resourcecom/DZY/three/entity/Order.hbm.xml / mapping resourcecom/DZY/three/entity/OrderItem.hbm.xml / /session-factory /hibernate-configuration三、操作DemoDaoTest注意Orderltem.hbm.xml图片黄色地方。如果没有加上。就会报下面的错误。1.增加public void testAddOrder() { Order order new Order(); order.setOrderNo(DZY); for (int i 0; i 6; i) { OrderItem oi new OrderItem(); oi.setProductId(10 i); oi.setQuantity(20 i); // demoDao.addOrderItem(oi) order.getOrderItems().add(oi); oi.setOrder(order); } demoDao.addOrder(order); }显示结果增加订单public void testAddOrderItem() { OrderItem oi new OrderItem(); oi.setProductId(55); oi.setQuantity(55); Order order new Order(); order.setOrderId(11); oi.setOrder(order); demoDao.addOrderItem(oi); }显示结果获得单个数据会包错不推荐这个方法在order.xmllazyfalse 懒加载开始为true 改为false bag lazyfalse nameorderItems cascadesave-update inversetrue能起效但是会增加运行速度在DemoDaopublic Order getOrder(Order order) { Session session SessionFactoryUtils.openSession(); Transaction transaction session.beginTransaction(); Order o session.get(Order.class, order.getOrderId()); //获得单个数据 。InitChildren这个需要在order定义 if(o ! null new Integer(1).equals(order.getInitChildren())) { Hibernate.initialize(o.getOrderItems()); // System.out.println(o.getOrderItems()); } transaction.commit(); session.close(); return o; }3.获得单个数据public void testGetOrder() { Order order new Order(); order.setOrderId(12); order.setInitChildren(1); Order odemoDao.getOrder(order); //failed to lazily initialize a collection of role: com.DZY.three.entity.Order.orderItems //could not initialize proxy - no Session System.out.println(o.getOrderNo()); // System.out.println(o.getOrderItems().size()); }显示结果4.查询全部public void testGetOrderList() { ListOrder orderListdemoDao.getOrderList(); for (Order order : orderList) { System.out.println(order.getOrderNo()); // System.out.println(order.getOrderItems().size()); } }显示结果5.删除public void testDelOrder() { Order order new Order(); order.setOrderId(11); this.demoDao.delOrder(order); }