目录

  • 一:一对多关联概念
    • 1.实体一对多关联(1:n)
    • 2.数据库一对多关联
  • 二:Hibernate实现单向一对多关联
    • 1.xml配置实现
  • 二:Hibernate双向一对多关联
    • 1.使用xml文件方式完成配置
    • 2.使用注解方式完成配置

一:一对多关联概念

1.实体一对多关联(1:n)

定义:

如果对于实体集A中的每一个实体,实体集B中有n个实体(n>=0)与之联系,反之,对于实体集B中的每一个实体,实体集A中至多只有一个实体与之联系,则称实体集A与实体集B有一对多联系,记为1:n。
实例:一个班级中有若干名学生,每个学生只在一个班级中学习。

示例:在一些购物网站中,用户和订单之间的关系就是一对多关联关系(一个用户可以有多个订单,而一个订单只属于一个用户。)

2.数据库一对多关联

  • 在关系模型中,只存在外键参照关系,而且是many方参照one方。

二:Hibernate实现单向一对多关联

引例:
通常情况下,在一些购物网站系统中,用户和订单之间的关系就是一对多关联关系,并且对于用户来说需要知道自己有哪些订单,对于商家来说需要知道某个订单属于哪个用户,思考这种情况该如何实现?

1.xml配置实现

用户类:

public class User {private int id;private String userName;private String passWord;private Set<Order> orders = new HashSet<>();public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}public Set<Order> getOrders() {return orders;}public void setOrders(Set<Order> orders) {this.orders = orders;}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + ", passWord=" + passWord + ", orders=" + orders + "]";}}

用户配置文件:

<?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 package="com.hibernate.entity"><class name="User" table="user"><id name="id" type="int"><column name="id"></column><generator class="native"></generator></id><property name="userName" column="user_name"type="java.lang.String"></property><property name="passWord" column="password"type="java.lang.String" /><set name="orders" cascade="all"><key column="user_id"></key><one-to-many class="Order" /></set></class>
</hibernate-mapping>

订单类:

public class Order {private int id;private int price;public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return "Order [id=" + id + ", price=" + price + ", getId()=" + getId() + ", getClass()=" + getClass()+ ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]";}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}}

订单配置文件:

<?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 package="com.hibernate.entity"><class name="Order" table="n_order"><id name="id" type="int"><column name="id"></column><generator class="increment"></generator></id><property name="price"></property></class>
</hibernate-mapping>

测试类:

public class Test {public static void main(String[] args) {// 保存用户// saveUser();// 保存订单// saveOrders();// 根据用户查找订单// findOrderByUserId();// 根据用户id删除订单deleteOrderByUserId();}public static void saveUser() {// 1.获取session对象Session session = HibernateUtil.openSession();Transaction tx = session.beginTransaction();User user = new User();user.setUserName("张三");user.setPassWord("123");session.save(user);tx.commit();session.close();// 5.关闭sessionFactory}public static void saveOrders() {// 1.获取session对象Session session = HibernateUtil.openSession();Transaction tx = session.beginTransaction();User user = session.get(User.class, new Integer(1));Set<Order> orders = user.getOrders();for (int i = 0; i < 3; i++) {Order order = new Order();order.setPrice(35);orders.add(order);}user.setOrders(orders);session.save(user);tx.commit();session.close();// 5.关闭sessionFactory}public static void findOrderByUserId() {Session session = HibernateUtil.openSession();Transaction tx = session.beginTransaction();User user = session.get(User.class, new Integer(1));System.out.println(user.toString());tx.commit();session.close();// 5.关闭sessionFactory}public static void deleteOrderByUserId() {Session session = HibernateUtil.openSession();Transaction tx = session.beginTransaction();User user = session.get(User.class, new Integer(1));session.delete(user);tx.commit();session.close();// 5.关闭sessionFactory}
}

当使用list集合映射时,需要在order表中添加一个额外字段来表示插入顺序

配置文件:

<?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 package="com.hibernate.entity"><class name="User" table="user"><id name="id" type="int"><column name="id"></column><generator class="native"></generator></id><property name="userName" column="user_name"type="java.lang.String"></property><property name="passWord" column="password"type="java.lang.String" /><list name="orders" cascade="all"><key column="user_id"></key><index column="order_index"></index><one-to-many class="Order" /></list></class>
</hibernate-mapping>

当使用Map集合映射时,需要在Order表中添加也给额外字段来记录Map中key的值

映射配置文件:

<?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 package="com.hibernate.entity"><class name="User" table="user"><id name="id" type="int"><column name="id"></column><generator class="native"></generator></id><property name="userName" column="user_name"type="java.lang.String"></property><property name="passWord" column="password"type="java.lang.String" /><map name="orders" cascade="all"><key column="user_id"></key><index column="order_key" type="string"></index><one-to-many class="Order" /></map></class>
</hibernate-mapping>

二:Hibernate双向一对多关联

目的:通过用户可以找到订单,通过订单也可以找到用户

1.使用xml文件方式完成配置

数据库表结构同上,只是配置文件发生改变
User类:

public class User {private int id;private String userName;private String passWord;private Map<String, Order> orders = new HashMap<>();public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}public Map<String, Order> getOrders() {return orders;}public void setOrders(Map<String, Order> orders) {this.orders = orders;}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + ", passWord=" + passWord + ", orders=" + orders + "]";}}

User类配置文件:

<?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 package="com.hibernate.entity"><class name="User" table="user"><id name="id" type="int"><column name="id"></column><generator class="native"></generator></id><property name="userName" column="user_name"type="java.lang.String"></property><property name="passWord" column="password"type="java.lang.String" /><map name="orders" cascade="all"><key column="user_id"></key><index column="order_key" type="string"></index><one-to-many class="Order" /></map></class>
</hibernate-mapping>

Order类:

public class Order {private int id;private int price;private User user;public User getUser() {return user;}public void setUser(User user) {this.user = user;}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return "Order [id=" + id + ", price=" + price + ", getId()=" + getId() + ", getClass()=" + getClass()+ ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]";}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}}

Order类配置文件:

<?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 package="com.hibernate.entity"><class name="Order" table="n_order2"><id name="id" type="int"><column name="id"></column><generator class="increment"></generator></id><property name="price"></property><many-to-one name="user" column="user_id" class="User"></many-to-one></class>
</hibernate-mapping>

2.使用注解方式完成配置

User类:


@Entity
@Table(name = "user")
public class User {private int id;private String userName;private String passWord;private Map<String, Order> orders = new HashMap<>();@Id@GeneratedValue(generator = "nat")@GenericGenerator(name = "nat", strategy = "native")public int getId() {return id;}public void setId(int id) {this.id = id;}@Column(name = "user_name")public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getPassWord() {return passWord;}public void setPassWord(String passWord) {this.passWord = passWord;}@OneToMany(mappedBy = "user", targetEntity = Order.class, cascade = CascadeType.ALL)@MapKeyColumn(name = "order_key")public Map<String, Order> getOrders() {return orders;}public void setOrders(Map<String, Order> orders) {this.orders = orders;}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + ", passWord=" + passWord + ", orders=" + orders + "]";}}

Order类:

@Entity
@Table(name = "n_order2")
public class Order {private int id;private int price;private User user;@ManyToOne@JoinColumn(name = "user_id")public User getUser() {return user;}public void setUser(User user) {this.user = user;}@Id@GeneratedValue(generator = "nat")@GenericGenerator(name = "nat", strategy = "native")public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return "Order [id=" + id + ", price=" + price + ", getId()=" + getId() + ", getClass()=" + getClass()+ ", hashCode()=" + hashCode() + ", toString()=" + super.toString() + "]";}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}}

《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射相关推荐

  1. 【SSH系列】Hibernate映射 -- 一对多关联映射

         映射原理        一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入 ...

  2. hibernate一对多关联映射

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

  3. 步步为营Hibernate全攻略(二)剪不断理还乱之:一对多关联映射

    一对多关联映射和多对一关联映射的原理是一致的,都是在多的一端加入一个外键,指向一的一端.但是他们又有所区别,有了多指向一的关系,在加载多的时候可以将一加载上来,而有了一对多的关系,在加载一的时候可以将 ...

  4. 一对多关联映射(单向关联)见项目:me_one_to_many

    1. 模型 一个用户组(group)对应多个用户. 2. 实体类(省略set,get方法) public class User { private int id; private String nam ...

  5. 【Java Web开发指南】Mybatis一对多关联映射

    文章目录 1 嵌套查询 2 嵌套结果 1 嵌套查询 <select id="findUserWithOrders2" parameterType="Integer& ...

  6. Mybatis注解实现一对多关联映射(@Many)

    mybatis注解实现一对多关联映射 @Select("<script> \n" +"\t\tselect a.*,p.punishment_money, p ...

  7. (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...

  8. jpa单向一对多关联映射

    如果在一的@OneToMany有@manyToOne则是双向一对多关联,如果在多的那面没有@manyToOne关联则是单向一对多关联 class和student是一对多的关系 表结构 student ...

  9. Hibernate一对多关联映射及cascade级联操作

    我们以客户(Customer)与订单(Order)为例 实体类创建 Order订单实体类 //订单-----多的一方 public class Order {private Integer id;pr ...

  10. java之hibernate之基于外键的一对一单向关联映射

    这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的. 2.类的结构 Pe ...

最新文章

  1. 上海Uber优步司机奖励政策(1月18日~1月24日)
  2. python雷达图-Python成绩单雷达图
  3. Oracle中group by用法
  4. 10.2 梯度下降-机器学习笔记-斯坦福吴恩达教授
  5. 【云图】一键生成连锁店品牌地图
  6. 存储引擎之必知必会 -- 检查点机制
  7. 以太坊go-ethereum项目源码本地环境搭建
  8. SpringBoot2.1.9 分布式锁ShedLock不执行坑
  9. mwc校准油门_编写下载服务器。 第五部分:油门下载速度
  10. 发动机冷启动和热启动的区别_「牛车实验室」AGM自动启停蓄电池解读 和普通蓄电池到底有什么区别...
  11. 解题:2017清华集训 无限之环
  12. dotty编译器语法特性之一交叉类型,联合类型和文本单例类型
  13. Vue入门 ---- 组件式开发
  14. 【LuoguP5289】[十二省联考2019] 皮配
  15. 你真的了解企业虚拟化吗?
  16. php json对象转为字符串,JSON对象转化为字符串(附上代码详细解答)
  17. 高效率笔记——5R笔记法(康奈尔笔记法)
  18. 如何播放html文件类型,m3u8格式如何播放
  19. 【Windows8开发】关于WinRT组件,WinRT dll,Win32 dll,WinRT exe组件的一些尝试
  20. redis关闭后在连接报错误:Could not connect to Redis at 127.0.0.1:6379: Connection refused

热门文章

  1. ECCV2022 | 多任务SOTA模型!分割/深度/边界/显著图四项任务
  2. 郑州高新区计算机,郑州高新区电脑维修
  3. 智云通CRM:销售高手如何维护自己的“地盘”?
  4. Matlab GUI编程技巧(十七):Matlab GUI设计总结
  5. 美国FICO评分系统简介
  6. 我乐网关停1月套牢2亿风投
  7. 定时器 java qua_Quartz定时任务调度机制解析(CronTirgger、SimpleTrigger )
  8. 零的突破!6所高校、2所“双非”顶刊发文
  9. DG449 High Voltage Single SPDT Analog Switch in SOT23-8
  10. 7.用户登陆,用户退出,记住用户名和密码