Hibernate双向多对多映射关系配置代码实例

1、实体类

package com.yl.bean;

import java.io.Serializable;
import java.util.Set;

/**
 * 商品实体类
 */
public class Goods implements Serializable {
  private Integer id;//商品id
  private String goodsName;//商品名
  private Double price;//商品价格
  private String remark;//备注
  private Set<GoodsOrder> orderSet;//商品所属订单

  public Goods() {
  }

  public Integer getId() {
    return id;
  }

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

  public String getGoodsName() {
    return goodsName;
  }

  public void setGoodsName(String goodsName) {
    this.goodsName = goodsName;
  }

  public Double getPrice() {
    return price;
  }

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

  public String getRemark() {
    return remark;
  }

  public void setRemark(String remark) {
    this.remark = remark;
  }

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

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

  @Override
  public String toString() {
    return "Goods{" +
        "goods_id=" + id +
        ", goodsName='" + goodsName + '\'' +
        ", price=" + price +
        ", remark='" + remark + '\'' +
        ", orderSet=" + orderSet +
        '}';
  }
}
package com.yl.bean;

import java.io.Serializable;
import java.util.Set;

/**
 * 商品订单实体类
 */
public class GoodsOrder implements Serializable {
  private Integer id;//订单id
  private String orderNo;//订单编号
  private Double price;//订单价格
  private Set<Goods> goodsSet;//订单包含的商品

  public GoodsOrder() {
  }

  public Integer getId() {
    return id;
  }

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

  public String getOrderNo() {
    return orderNo;
  }

  public void setOrderNo(String orderNo) {
    this.orderNo = orderNo;
  }

  public Double getPrice() {
    return price;
  }

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

  public Set<Goods> getGoodsSet() {
    return goodsSet;
  }

  public void setGoodsSet(Set<Goods> goodsSet) {
    this.goodsSet = goodsSet;
  }

  @Override
  public String toString() {
    return "GoodsOrder{" +
        "id=" + id +
        ", orderNo='" + orderNo + '\'' +
        ", price=" + price +
        ", goodsSet=" + goodsSet +
        '}';
  }
}

2、全局配置文件(hibernate.cfg.xml)

<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <!--数据源配置-->
    <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?characterEncoding=utf8&amp;serverTimezone=GMT%2B8</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">123456</property>
    <!--显示sql-->
    <property name="hibernate.show_sql">true</property>
    <!--自动创建表-->
    <property name="hibernate.hbm2ddl.auto">update</property>
    <!--指定映射配置文件的位置-->
    <mapping resource="com/yl/bean/Goods.hbm.xml"></mapping>
    <mapping resource="com/yl/bean/GoodsOrder.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>

3、商品类映射配置文件(Goods.hbm.xml)

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <!--配置Goods类-->
  <class name="com.yl.bean.Goods" table="t_goods">
    <!--主键-->
    <id name="id" column="id" type="java.lang.Integer">
      <generator class="identity"></generator>
    </id>

    <property name="goodsName" column="goodsName" type="java.lang.String"></property>
    <property name="price" column="price" type="java.lang.Double"></property>
    <property name="remark" column="remark"></property>

    <!--多对多关系映射-->
    <set name="orderSet" table="t_goods_order">
      <key column="goods_id"></key>
      <many-to-many class="com.yl.bean.GoodsOrder" column="order_id"></many-to-many>
    </set>
  </class>
</hibernate-mapping>

4、订单类映射配置文件(GoodsOrder.hbm.xml)

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <!--配置GoodsOrder类-->
  <class name="com.yl.bean.GoodsOrder" table="t_order">
    <!--主键-->
    <id name="id" column="id" type="java.lang.Integer">
      <generator class="identity"></generator>
    </id>

    <property name="orderNo" column="orderNo" type="java.lang.String"></property>
    <property name="price" column="price" type="java.lang.Double"></property>

    <!--多对多关系映射-->
    <set name="goodsSet" table="t_goods_order">
      <key column="order_id"></key>
      <many-to-many class="com.yl.bean.Goods" column="goods_id"></many-to-many>
    </set>
  </class>
</hibernate-mapping>

5、测试

 @Test
  public void addTest(){
    Session session= HibernateUtils.getSession();

    Goods goods=new Goods();
    goods.setGoodsName("小米");
    goods.setPrice(3999.0);
    goods.setRemark("为发烧而生");

    Goods goods1=new Goods();
    goods1.setRemark("中华有为");
    goods1.setPrice(3999.0);
    goods1.setGoodsName("华为");

    GoodsOrder order=new GoodsOrder();
    order.setOrderNo("001");
    order.setPrice(7998.0);

    GoodsOrder order1=new GoodsOrder();
    order1.setOrderNo("002");
    order1.setPrice(7998.0);

    Set<GoodsOrder> orderSet=new HashSet<>();
    orderSet.add(order);
    orderSet.add(order1);
    goods.setOrderSet(orderSet);
    goods1.setOrderSet(orderSet);

   /* Set<GoodsOrder> orderSet1=new HashSet<>();
    orderSet1.add(order1);
    goods1.setOrderSet(orderSet1);*/

    Set<Goods> goodsSet=new HashSet<>();
    goodsSet.add(goods);
    goodsSet.add(goods1);
//注意这里,只需要一方关联即可(上面已经关联了,所以不需要再次添加商品集合),两方关联会造成主键重复,报错
//    order.setGoodsSet(goodsSet);
//    order1.setGoodsSet(goodsSet);

    Transaction transaction=session.beginTransaction();

    session.save(goods);
    session.save(goods1);
    session.save(order);
    session.save(order1);

    transaction.commit();
    session.close();

  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Hibernate 与 Mybatis 的共存问题,打破你的认知!(两个ORM框架)

    很长一段时间,网上有很多关于Hibernate与Mybatis孰优孰劣的争论,两个阵营的人谁也不能说服谁,每个人的理由都很有道理. 今天,我分享的主题是:在一个项目中同时使用Hibernate和Mybatis两个ORM框架. 作为一个开发者,没有必要花费过多的时间去证明技术无用论,当你开始指责某个框架垃圾,另外一个框架最好时,隐性的暴露出你对某个框架没有深入的研究,无知的指责对于技术的提升没有任何的帮助. 框架本身没有对错一说,只有适合和更适合项目的选择.任何框架都有自身的能力范围,就拿Hibe

  • JavaEE SpringMyBatis是什么? 它和Hibernate的区别及如何配置MyBatis

    MyBatis MyBatis 是一个基于 Java 的持久层框架.MyBatis 提供的持久层框架包括 SQL Maps 和 Data Access Objects(DAO),它消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索. MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录. 目前,Java 的持久层框架产品有许多,常见的有 Hiber

  • springboot 2.3之后消失的hibernate-validator解决方法

    项目升级到springboot2.3之后,参数校验的注解报错,发现spring-boot-starter-web的依赖项已经去除了依赖 点开spring-boot-starter-web源码看了下. <?xml version="1.0" encoding="UTF-8"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache

  • Java的Hibernate框架中的双向主键关联与双向外键关联

    一.双向主键关联 双向的主键关联其实是单向一对一主键关联的一种特殊情况,只不过要在关联对象的两端的映射文件中都要进行<one-to-one>的配置,另外还要在主映射的主键一端采用foreign外键关联属性. 这里同样使用Person和IdCard来讨论,一个人对应着一个唯一的身份证,而且一个身份证也唯一映射着一个人,所以这就产生了双向的关联关系,Person的主键同样也是IdCard的主键,分别是主键的同时也是外键,这种关联关系成为双向一对一映射,表现到关系模型中可如下图: 图中的两个表采用了

  • 详解hibernate双向多对多关联映射XML与注解版

    双向多对多关联映射原理: 假设,一个员工可能有多个角色,一个角色可能有多个员工,从员工或角色的角度看,这就是多对多的关系,不管从哪一个角度看,都是多对多的联系.多对多关联映射关系一般采用中间表的形式来实现,即新增一种包含关联双方主键的表.实现多对多关联关系,在数据库底层通过添加中间表指定关联关系,而在hibernate框架在双方的实体中添加一个保存对方的集合,在双方的映射文件中使用<set>元素和<many-to-many>元素进行关联关系的配置. 如下图所示: (1)XML版 R

  • Java的Hibernate框架中一对多的单向和双向关联映射

    一.一对多单向关联映射 一对多关系的对象模型在日常生活中也经常看到,就拿学生和班级来说,一个班级里有多个学生,所以班级和学生的关系是一对多的关系,映射到对象模型中,如下图: 对象模型说明了这种一对多的关系是由一的一端来维护的,那么映射成关系模型就是一个班级字段下面会有多个学生,这样就形成了一对多的关系,通过班级能够查询获得学生信息,对应的关系模型如下图: 1.基本配置 有了对象模型接下来就让它们映射为对应的关系代码,在进行关系映射时需要在一的一端添加<one-to-many>标签,另外还需要在

  • Hibernate一对多关联双向关联代码实现分享

    1.创建实体类(Customer.java.Orders.java) 复制代码 代码如下: package wck.stu.vo.oneToMany_single; import java.util.HashSet;import java.util.Set; public class Customer {    private String id = ""; private String cName = ""; private String bank = "

  • Hibernate持久化对象生命周期原理解析

    三态的基本概念 1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象: 2, 持久化状态(Persistent):与session关联并且在数据库中有相应数据.已经持久化,加入到了Session缓存中.如通过hibernate语句保存的对象.处于此状态的对象叫持久对象: 3, 游离状态(Detached):持久化对象脱离了Session的对象.如Session缓存被清空的

  • Hibernate双向多对多映射关系配置代码实例

    1.实体类 package com.yl.bean; import java.io.Serializable; import java.util.Set; /** * 商品实体类 */ public class Goods implements Serializable { private Integer id;//商品id private String goodsName;//商品名 private Double price;//商品价格 private String remark;//备注

  • Hibernate双向一对一映射关系配置代码实例

    1.外键映射 1.1.实体类 package com.yl.bean; import java.io.Serializable; /** * 公民实体类 */ public class Person implements Serializable { private Integer id; private String name; private PersonCard card; public Person() { } public Person(Integer id, String name,

  • 浅谈hibernate中多表映射关系配置

    1.one-to-many 一对多关系的映射配置(在一的一方实体映射文件中配置) <!-- cascade属性:级联操作属性 save-update: 级联保存,保存客户时,级联保存客户关联的联系人 delete:级联删除,删除客户时,级联删除客户关联的联系人 all:级联保存+级联删除 --> <!-- inverse属性:设置是否不维护关联关系 true:不维护关联 false(默认值):维护关联 --> <!-- 一对多 --> <set name=&quo

  • java Hibernate多对多映射详解及实例代码

    java Hibernate多对多映射 前言: 一.单向多对多 单向多对多的例子用人和职位来举例,一个人可以有多个职位,一个职位会有多个人.单向多对多是指只能在一端来查询获取另一端的内容.多对多的关系在生成关系模型时会生成对象之前的关联表,关联表中存放着两个关系表的主键,它们的关系如下所示: 代码部分:  (1)映射和关系类 因为是单向的关系,所以只需要在一端进行维护,所以我们需要在User.hbm.xml配置文件中添加<many-to-many>标签,并在标签中加上对应的列关系,在<s

  • Nginx正反向代理及负载均衡等功能实现配置代码实例

    这篇文章主要介绍了Nginx正反向代理及负载均衡等功能实现配置代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 系统环境: VirtualBox Manager Centos6.4 nginx1.10.0 IP对应的机器名: IP 机器名 角色名 10.0.0.139 [elk] client 10.0.0.136 [lvs-master] nginx server 10.0.0.137 [kvm] web server 1 10.0.0

  • SpringCloud Gateway跨域配置代码实例

    这篇文章主要介绍了SpringCloud Gateway跨域配置代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Springboot版本:2.1.8.RELEASE SpringCloud版本:Greenwich.SR2 yml配置: spring: cloud: gateway: globalcors: cors-configurations: '[/**]': # 允许携带认证信息 # 允许跨域的源(网站域名/ip),设置*为全部

  • springboot项目访问静态资源的配置代码实例

    这篇文章主要介绍了springboot项目访问静态资源的配置代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 这里只是简单记录当上传图片不是放在tomcat其他服务器中时,只是放在磁盘中便可以这样配置,在项目启动后可以访问到磁盘中的资源. @Configuration public class SystemConfigurer implements WebMvcConfigurer { @Value("${jeewx.path.uploa

  • Python Celery多队列配置代码实例

    这篇文章主要介绍了Python Celery多队列配置代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Celery官方文档 项目结构 /proj -__init__ -app.py #实例化celery对象 -celeryconfig.py #celery的配置文件 -tasks.py #celery编写任务文件 app.py #coding:utf-8 from __future__ import absolute_import fr

  • Hibernate实现many-to-many的映射关系

    Hibernate多对多 关联映射(many-to-many) 在操作和性能方面都不太理想,所以多对多的映射使用较少,实际使用中最好转换成一对多的对象模型: Hibernate会为我们创建中间关联表,转换成两个一对多. (1)一个最简单的例子就是学生选课的数据表了 (2)Student.java public class Course { private Integer id; private String name; private Set<StuCourse> stuCourses; //

随机推荐