《Hibernate上课笔记》------class6------Hibernate实现一对多关联映射
目录
- 一:一对多关联概念
- 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实现一对多关联映射相关推荐
- 【SSH系列】Hibernate映射 -- 一对多关联映射
映射原理 一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入 ...
- hibernate一对多关联映射
一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...
- 步步为营Hibernate全攻略(二)剪不断理还乱之:一对多关联映射
一对多关联映射和多对一关联映射的原理是一致的,都是在多的一端加入一个外键,指向一的一端.但是他们又有所区别,有了多指向一的关系,在加载多的时候可以将一加载上来,而有了一对多的关系,在加载一的时候可以将 ...
- 一对多关联映射(单向关联)见项目:me_one_to_many
1. 模型 一个用户组(group)对应多个用户. 2. 实体类(省略set,get方法) public class User { private int id; private String nam ...
- 【Java Web开发指南】Mybatis一对多关联映射
文章目录 1 嵌套查询 2 嵌套结果 1 嵌套查询 <select id="findUserWithOrders2" parameterType="Integer& ...
- Mybatis注解实现一对多关联映射(@Many)
mybatis注解实现一对多关联映射 @Select("<script> \n" +"\t\tselect a.*,p.punishment_money, p ...
- (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...
- jpa单向一对多关联映射
如果在一的@OneToMany有@manyToOne则是双向一对多关联,如果在多的那面没有@manyToOne关联则是单向一对多关联 class和student是一对多的关系 表结构 student ...
- Hibernate一对多关联映射及cascade级联操作
我们以客户(Customer)与订单(Order)为例 实体类创建 Order订单实体类 //订单-----多的一方 public class Order {private Integer id;pr ...
- java之hibernate之基于外键的一对一单向关联映射
这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的. 2.类的结构 Pe ...
最新文章
- 上海Uber优步司机奖励政策(1月18日~1月24日)
- python雷达图-Python成绩单雷达图
- Oracle中group by用法
- 10.2 梯度下降-机器学习笔记-斯坦福吴恩达教授
- 【云图】一键生成连锁店品牌地图
- 存储引擎之必知必会 -- 检查点机制
- 以太坊go-ethereum项目源码本地环境搭建
- SpringBoot2.1.9 分布式锁ShedLock不执行坑
- mwc校准油门_编写下载服务器。 第五部分:油门下载速度
- 发动机冷启动和热启动的区别_「牛车实验室」AGM自动启停蓄电池解读 和普通蓄电池到底有什么区别...
- 解题:2017清华集训 无限之环
- dotty编译器语法特性之一交叉类型,联合类型和文本单例类型
- Vue入门 ---- 组件式开发
- 【LuoguP5289】[十二省联考2019] 皮配
- 你真的了解企业虚拟化吗?
- php json对象转为字符串,JSON对象转化为字符串(附上代码详细解答)
- 高效率笔记——5R笔记法(康奈尔笔记法)
- 如何播放html文件类型,m3u8格式如何播放
- 【Windows8开发】关于WinRT组件,WinRT dll,Win32 dll,WinRT exe组件的一些尝试
- redis关闭后在连接报错误:Could not connect to Redis at 127.0.0.1:6379: Connection refused
热门文章
- ECCV2022 | 多任务SOTA模型!分割/深度/边界/显著图四项任务
- 郑州高新区计算机,郑州高新区电脑维修
- 智云通CRM:销售高手如何维护自己的“地盘”?
- Matlab GUI编程技巧(十七):Matlab GUI设计总结
- 美国FICO评分系统简介
- 我乐网关停1月套牢2亿风投
- 定时器 java qua_Quartz定时任务调度机制解析(CronTirgger、SimpleTrigger )
- 零的突破!6所高校、2所“双非”顶刊发文
- DG449 High Voltage Single SPDT Analog Switch in SOT23-8
- 7.用户登陆,用户退出,记住用户名和密码