Hibernate关系映射---双向多对多增删查改实例

来源:互联网 发布:淘宝店被永久封了 攻略 编辑:程序博客网 时间:2024/05/24 01:02

Hibernate关系映射---双向多对多增删查改实例

1、新建一个Java工程,添加hibernate3.3支持,连接test数据库

2、在src下新建com.etc.dao包,在包下新建Order.java类:

package com.etc.dao;import java.util.HashSet;import java.util.Set;public class Order {private int no;private String owner;private Set<Product> products = new HashSet<Product>();//订单中有商品的set集合public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getOwner() {return owner;}public void setOwner(String owner) {this.owner = owner;}public Set<Product> getProducts() {return products;}public void setProducts(Set<Product> products) {this.products = products;}@Overridepublic String toString() {return "Order [no=" + no + ", owner=" + owner + ", products="+ products + "]";}}

3、在com.etc.dao下新建Product.java类:

package com.etc.dao;import java.util.HashSet;import java.util.Set;public class Product {private int no;private String name;private Set<Order> orders = new HashSet<Order>();//商品中有订单的set集合public int getNo() {return no;}public void setNo(int no) {this.no = no;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Order> getOrders() {return orders;}public void setOrders(Set<Order> orders) {this.orders = orders;}@Overridepublic String toString() {return "Product [no=" + no + ", name=" + name + ", orders=" + orders+ "]";}}

4、在com.etc.dao下新建Order.hbm.xml映射文件:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.etc.dao.Order" table="t_order" catalog="test"><id name="no"><column name="order_no"/><generator class="native"/></id><property name="owner"><column name="order_owner"/></property><!-- 在多端Product配置多端Product --><set name="products" table="t_order_product" fetch="join" cascade="save-update"><key  column="order_no"></key><many-to-many class="com.etc.dao.Product" column="product_no"></many-to-many></set></class></hibernate-mapping>

5、在com.etc.dao下新建Product.hbm.xml映射文件:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.etc.dao.Product" table="t_product" catalog="test"><id name="no"><column name="product_no"/><generator class="native"/></id><property name="name"><column name="product_name"/></property><!-- 在多端Product中配置多端Order --><set name="orders" table="t_order_product" cascade="save-update" fetch="join"><key  column="product_no"></key><many-to-many class="com.etc.dao.Order" column="order_no"></many-to-many></set></class></hibernate-mapping>

6、修改hibernate.cfg.xml配置文件:

<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><!-- Generated by MyEclipse Hibernate Tools.                   --><hibernate-configuration>    <session-factory>    <property name="show_sql">true</property>    <property name="format_sql">true</property>    <!-- <property name="hbm2ddl.auto">create</property> -->    <property name="current_session_context_class">thread</property>        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>        <property name="connection.username">root</property>        <property name="connection.password">root</property>        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>        <property name="myeclipse.connection.profile">com.mysql.jdbc.Driver</property>        <!-- 配置映射文件 -->    <mapping resource="com/etc/dao/Order.hbm.xml"/>    <mapping resource="com/etc/dao/Product.hbm.xml"/>    </session-factory></hibernate-configuration>

7、在工程下新建test文件夹,在文件夹下新建com.etc.dao包,在包下新建ProductDAOTest.java测试类:

package com.etc.dao;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.junit.Test;public class ProductDAOTest {/** * Description:新增:由多端Order来操作多端Product,在Order.hbm.xml中配置cascade=all,使得级联增加 * @author zoey * @date 2017年7月27日 */@Testpublic void testCreate1(){SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.getCurrentSession();session.beginTransaction();Order o1 = new Order();o1.setOwner("李白");Product p1 = new Product();p1.setName("梨");Product p2 = new Product();p2.setName("桃子");o1.getProducts().add(p1);o1.getProducts().add(p2);session.save(o1);session.getTransaction().commit();}/** * Description:新增:由多端Product来操作多端Order,在Product.hbm.xml中配置cascade=all,使得级联增加 * @author zoey * @date 2017年7月27日 */@Testpublic void testCreate2(){SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.getCurrentSession();session.beginTransaction();Product p1 = new Product();p1.setName("雪梨");Order o1 = new Order();o1.setOwner("李冰冰");Order o2 = new Order();o2.setOwner("范冰冰");p1.getOrders().add(o1);p1.getOrders().add(o2);session.save(p1);session.getTransaction().commit();}/** * Description:修改:由多端Order操作多端Product * @author zoey * @date 2017年7月27日 */@Testpublic void testUpdate1(){SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.getCurrentSession();session.beginTransaction();Order o1 = (Order)session.get(Order.class,1);o1.setOwner("美女");for(Product p:o1.getProducts()){p.setName("香蕉");}session.getTransaction().commit();}/** * Description:修改:由多端Product操作多端Order * @author zoey * @date 2017年7月27日 */@Testpublic void testUpdate2(){SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.getCurrentSession();session.beginTransaction();Product p1 = (Product)session.get(Product.class,1);p1.setName("芒果");for(Order o:p1.getOrders()){o.setOwner("李白");}session.getTransaction().commit();}/** * Description:查询:由多端Order操作多端Product,在Order.hbm.xml中设置fetch=join属性,使得只发起一条sql,提高查询效率 * @author zoey * @date 2017年7月27日 */@Testpublic void testRetrieve1(){SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.getCurrentSession();session.beginTransaction();Order o1 = (Order)session.get(Order.class,1);System.out.println(o1.getOwner());for(Product p:o1.getProducts()){System.out.println(p.getName());}session.getTransaction().commit();}/** * Description:查询:由多端Product操作多端Order,在Order.hbm.xml中设置fetch=join属性,使得只发起一条sql,提高查询效率 * @author zoey * @date 2017年7月27日 */@Testpublic void testRetrieve2(){SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.getCurrentSession();session.beginTransaction();Product p1 = (Product)session.get(Product.class,1);System.out.println(p1.getName());for(Order o:p1.getOrders()){System.out.println(o.getOwner());}session.getTransaction().commit();}/** * Description:删除:删除指定的订单,设置了cascade=all之后,级联删除,该订单的所有商品也全部删除 * 所以不应该设置cascade=all属性,删除订单的时候,将两者之间的关系删除,但是商品不删除 * 只需要将cascade设置为save-update便可 * @author zoey * @date 2017年7月27日 */@Testpublic void testDelete1(){SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.getCurrentSession();session.beginTransaction();Order o1 = (Order)session.get(Order.class,1);session.delete(o1);session.getTransaction().commit();}/** * Description:删除:删除指定的商品,设置了cascade=all之后,级联删除,该商品的所有订单也全部删除 * 所以不应该设置cascade=all属性,删除商品的时候,删除商品和订单之间的关系,但是订单不删除 * 只需要将cascade设置为save-update便可 * @author zoey * @date 2017年7月27日 */@Testpublic void testDelete2(){SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();Session session = sessionFactory.getCurrentSession();session.beginTransaction();Product p1 = (Product)session.get(Product.class,1);session.delete(p1);session.getTransaction().commit();}}

总结:

1、双向多对多关系:任意一方的多端都可以操作另外一方的多端,所以,在测试类中的所有增删查改操作中,都有两种选择。

2、要注意配置cascade属性和fetch属性。

原创粉丝点击