hibernate中的关系映射01一对多映射

要了解的概念:
关系
一对多
多对一
多对多
一对一
单项关联
双向关联
级联操作


需求:客户与订单的关系是一对多

准备项目2
(1)创建项目
hibernate02relation
(2)引入jar,同前一个项目
(3)复制实体、映射、配置、工具类

1、订单表(也可以后面自动创建)


Create Table

CREATE TABLE `t_order` ( 
  `id` bigint(20) NOT NULL AUTO_INCREMENT, 
  `order_no` varchar(20) DEFAULT NULL, 
  `product_name` varchar(100) DEFAULT NULL, 
  `customer_id` bigint(20) DEFAULT NULL, 
  PRIMARY KEY (`id`), 
  KEY `FKesy3n2gc3fa0s3trrk3tvyv9a` (`customer_id`), 
  CONSTRAINT `FKesy3n2gc3fa0s3trrk3tvyv9a` FOREIGN KEY (`customer_id`) REFERENCES `t_customer` (`c_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4;

2、创建Order实体类
package name.yaohuan.hibernate.pojo.one2many;
/**
 * 订单(多方)
 */
public class Order {
    private Long id;
    private String orderNo;
    private String productName;

    //关联客户
    private Customer customer;
}

3、修改Customer实体类
package name.yaohuan.hibernate.pojo.one2many;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
/**
 * 客户(一方)
 */
public class Customer{
    private Long id;
    private String name;
    private Character gender;
    private Integer age;
    private String level;
    
    //关联订单
    private Set<Order> orders = new HashSet<Order>();
}

4、在Customer配置文件中配置一对多
     <class name="Customer" table="t_customer">
         ......
         <!-- 一对多配置:属性名称 -->
         <set name="orders">
             <!-- 外键字段名称 -->
             <key column="customer_id"></key>
             <!-- 属性所属的类型 -->
             <one-to-many class="Order"/>
         </set>
     </class>

5、Order配置文件
<hibernate-mapping package="com.**.hibernate.pojo.one2many">
 
     <class name="Order" table="t_order">
         <id name="id" column="id">
             <generator class="native"></generator>
         </id>
         <property name="orderNo" column="order_no" length="20"></property>
         <property name="productName" column="product_name" length="100"></property>
         
         <!-- 多对一配置 -->
         <many-to-one name="customer" class="Customer" column="customer_id" />
     </class>
</hibernate-mapping> 

6、将映射文件加入hibernte.cfg.xml
        <!-- 4、*.hbm.xml文件 -->
        <mapping resource="com/**/hibernate/pojo/one2many/Customer.hbm.xml"/>
        <mapping resource="com/**/hibernate/pojo/one2many/Order.hbm.xml"/>

7、测试新增关联数据
public class  One2manyTest {
    /**
     * 需求:1个客户 2张订单
     */
    @Test
    public void testCreateOrder(){

        //准备数据
        Customer customer = new Customer();
        customer.setName("老王");
        customer.setGender('男');
        customer.setAge(18);
        customer.setLevel("VIP");

        Order o1 = new Order();
        o1.setOrderNo("210009070001");
        o1.setProductName("看透SpringMVC源代码分析与实践");

        Order o2 = new Order();
        o2.setOrderNo("210009070002");
        o2.setProductName("淘宝技术这十年");

        Session session = HibernateUtil.openSession();
        Transaction tx = session.beginTransaction();

        //建立一对多双向关系(非必须,也可以建立单项关联)
        customer.getOrders().add(o1);
        customer.getOrders().add(o2);

        o1.setCustomer(customer);
        o2.setCustomer(customer);

        //保存数据
        session.save(customer);
        session.save(o1);
        session.save(o2);

        //数据提交
        tx.commit();
        session.close();
    }
}


8、测试查询订单
/**
 * 查询操作
 */
@Test
public void testSearch(){

    Session session = HibernateUtil.openSession();
    Transaction tx = session.beginTransaction();

    //查询一个客户,关联查询订单
    Customer customer = session.get(Customer.class, 1L);
    System.out.println(customer.getName()+"的订单:");
    Set<Order> orders = customer.getOrders();
    for (Order order : orders) {
        System.out.println(order.getOrderNo()+","+order.getProductName());
    }

    tx.commit();
    session.close();
}



猜你喜欢

转载自blog.csdn.net/saint_lmy/article/details/80763148
今日推荐