Hibernate之一对多(多对一)

一、双向关联保存客户订单

1、搭建环境,项目结构如下

2、代码及配置如下(数据库里订单表不能用order,因为order是数据库关键字)(客户外键cid和订单表外键cid要在配置中写一致)

package com.hjp.onetomany;

import java.util.HashSet;
import java.util.Set;

/**
 * Created by JiaPeng on 2016/1/2.
 */
public class Customer {
    private int id;
    private String name;
    private Set<Order> orderSet=new HashSet<Order>() ;

    public Set<Order> getOrderSet() {
        return orderSet;
    }

    public void setOrderSet(Set<Order> orderSet) {
        this.orderSet = orderSet;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", name=‘" + name + ‘\‘‘ +
                ", orderSet=" + orderSet +
                ‘}‘;
    }
}

Customer

<?xml version="1.0" encoding="UTF-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 name="com.hjp.onetomany.Customer" table="customer">
      <id name="id">
          <generator class="native"></generator>
      </id>
      <property name="name"></property>
      <set name="orderSet">
          <key column="cid"></key>
          <one-to-many class="com.hjp.onetomany.Order"></one-to-many>
      </set>
  </class>
</hibernate-mapping>

customer.hbm.xml

package com.hjp.onetomany;

/**
 * Created by JiaPeng on 2016/1/2.
 */
public class Order {
    private int id;
    private double price;
    private Customer customer=new Customer();

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

    @Override
    public String toString() {
        return "Order{" +
                "price=" + price +
                ", id=" + id +
                ‘}‘;
    }
}

Order

<?xml version="1.0" encoding="UTF-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 name="com.hjp.onetomany.Order" table="orders">
       <id name="id">
           <generator class="native"></generator>
       </id>
       <property name="price"></property>
       <many-to-one name="customer" class="com.hjp.onetomany.Customer" column="cid"></many-to-one>
   </class>
</hibernate-mapping>

order.hbm.xml

package com.hjp.utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Created by JiaPeng on 2016/1/2.
 */
public class HibernateUtils {
private static final SessionFactory sessionFactory;
    static {
        Configuration configuration=new Configuration().configure();
        sessionFactory=configuration.buildSessionFactory();
    }
    public static Session getSession(){
        return sessionFactory.openSession();
    }
}

HibernateUtils

<?xml version="1.0" encoding="UTF-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>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/h1</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">hjp123</property>
        <!--设置c3p0-->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!--c3p0连接池配置信息-->
        <property name="c3p0.min_size">5</property>
        <property name="c3p0.max_size">20</property>
        <property name="c3p0.timeout">120</property>
        <property name="c3p0.idle_test_period">3000</property>
        <!--显示SQL并格式化-->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <!--ddl生成策略,后面可以改为update-->
        <property name="hibernate.hbm2ddl.auto">create</property>
        <!--导入映射文件-->
        <!--<mapping resource="com/hjp/hbm/customer.hbm.xml"></mapping>-->
        <mapping resource="com/hjp/onetomany/customer.hbm.xml"></mapping>
        <mapping resource="com/hjp/onetomany/order.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

hibernate.cfg.xml

  @Test
    public void func2() {
        Session session = HibernateUtils.getSession();
        session.beginTransaction();
        //创建客户
        Customer customer = new Customer();
        customer.setName("张三");
        //创建两个订单
        Order order1 = new Order();
        order1.setPrice(121);
        Order order2 = new Order();
        order2.setPrice(122);
        //客户关联订单
        customer.getOrderSet().add(order1);
        customer.getOrderSet().add(order2);
        //订单关联客户
        order1.setCustomer(customer);
        order2.setCustomer(customer);
        session.save(customer);
        session.save(order1);
        session.save(order2);
        session.getTransaction().commit();
        session.close();
    }

测试类中测试方法

二、配置中使用cascade,优化代码,单向关联完成客户和订单保存

时间: 2024-11-13 09:41:06

Hibernate之一对多(多对一)的相关文章

Hibernate映射关系之多对多

1.用户表user和优惠券coupon存在多对多的关系,一个用户可以拥有多个优惠券,一个优惠券可以从属于多个用户. 2.user.java,创建了中间表tb_user_coupon (1)JoinTable表示中间表的 (2) /** * 一个用户可以拥有多个优惠券 但优惠券只有自己的属性,没有用户的引用 单边的一对多关系 */ @ManyToMany(fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST }) @JoinTable(n

深入浅出Hibernate(二)多对一关系映射

学习Hibernate是为了更方便的操作数据库,在数据库中的关系模型中存在多对一的关系,比如下图所示的员工和部门之间的关系,那么这种关系在Hibernate中如何映射呢?让我用一个小Demo来详细讲解. 建立映射分为以下几步: 1.设计domain对象Department.Employee,代码如下: package cn.itcast.hibernate.domain; public class Department { private int id; private String name;

--------Hibernate框架之双向多对多关系映射

今天跟大家分享下在Hibernate中双向的多对多的映射关系 这次我们以项目和员工举个栗子,因为大家可以想象得到,在真实的环境下,一个项目肯定是对应着多个员工的,这毫无疑问, 那么同时,一个比较牛员工也能同时参与多个项目的开发,这就体现了双向多对多的关系. 首先呢,我们得弄清楚在底层数据库中表与表之间的关系,我们创建一个员工表(Employee)和项目表(Project)毫无疑问,那么我们要怎么体现出多对多的关系呢? 当然有很多种方法,这里我以单独提出一张关系表为例,也就是说,我单独创建一张表来

Hibernate一对多、多对一关联

一对多.多对一关联:在多方加外键 示例:Group(一方)和User(多方),一个Group可以有多个User,每个User只能属于一个Group   多对一单向关联 在User(多方)中建Group(一方)对象,并添加@ManyToOne注解 1.建Group实体类和User实体类,添加Annotation注解,如下 @Entity @Table(name="_group") //group在MySQL中是关键字,不能直接做表名 public class Group { privat

Hibernate实体映射文件多对多等关系简单应用技巧

第一步,写注释: <!--xx属性,本类与Yy(类)的多对一 --> <!--xx属性,本类与Yy(类)的一对多 --> <!--xx属性,本类与Yy(类)的多对多 --> <!--xx属性,本类与Yy(类)的一对一 --> 第二部,拷模版 <!--xx属性,本类与Yy(类)的多对一 --> <many-to-one name="" class="" column="">&l

hibernate关系映射(多对多)

多对多关系(学生Student,课程Course) 学生类的定义以及hbm文件的配置如下 1 public class Student { 2 private int id; 3 private String name; 4 private Set<Course> courses = new HashSet<Course>(); 5 } 1 <?xml version="1.0" encoding="UTF-8"?> 2 <

hibernate关系映射(多对一)

对多一关系是最普遍也是最重要的一种对象关系,其中又包括了单向的多对一,单向的一对多以及双向的多对一关系 单向多对一 多的一方:学生(Student) 一的一方:班级(Grade) 班级类的定义以及hbm文件配置如下 1 public class Grade { 2 private int id; 3 private String name; 4 } 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTY

一口一口吃掉Hibernate(六)——多对多关联映射

今天来说说hibernate中的多对多关联映射,多对多关联映射涉及到单向映射和双向映射2种. 首先举个多对多关联例子:用户User和角色Role,一个用户可以属于多个角色,一个角色可以有多个用户.这就是典型的多对多关联的例子.而单向关联映射则是只能由A端去操作B端,B端不能操作A端的数据.而双向关联映射则是A,B两端都可以操作另一端的数据. 先说单向关联映射,实体类如下: <span style="font-size:18px">/** * 学生类 * @author Lo

一口一口吃掉Hibernate(四)——多对一单向关联映射

hibernate对于数据库的操作,全部利用面向对象的思维来理解和实现的.一般的单独表的映射,相信大家都没有问题,但是对于一些表之间的特殊关系,Hibernate提供了一些独特的方式去简化它. 今天就来说说多对一的关联映射. 数据库中有多对一的关系,Hibernate自然也有对象的多对一的关联关系.比如用户和用户组,一个用户只属于一个组,一个组有多名用户.我们就可以说用户和用户组的关系就是多对一的关系.用对象的uml图表示一下: 在Hibernate中如何来实现呢?首先定义这两个实体类: pac

Hibernate学习8—Hibernate 映射关系(多对多)

第二节:Hibernate 多对多映射关系实现 比如学生和课程是多对多的关系: 一个学生可以选多个课程: 一个课程可以被多个学生选中,所以是多对多的关系: 1,多对多单向实现: 单向关系: 这里通过学生可以获取这个学生选修的课程: 但是通过课程无法获取选修这门课程的学生: Student.java: package com.cy.model; import java.util.HashSet; import java.util.Set; public class Student { privat