编程的目标之一是代表现实世界中的模型。 通常,应用程序需要对实体之间的某些关系进行建模。 在上一篇有关Hibernate关联的文章中,我描述了建立“一对一”关系的规则。 今天,我将向您展示如何设置双向的“ 一对多 ”和“ 多对一 ”关联。 这个例子将基于以前的Hibernate教程 。

首先,我需要说我的代码示例将基于一个简单的情况。 让我们想象一个足球联赛。 每个联赛都有球队,并且在球队中可以扮演一些球员。 因此,总结如下:一队有很多球员,一个球员可以为一个队效力。 通过这种方式,我们得到了明显的“ 一对多 ”和“ 多对一 ”关系。
在此示例中,我将MySQL用作数据库。 以下是用于创建表的脚本:

CREATE TABLE `teams` (`id` int(6) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;CREATE TABLE `players` (`id` int(6) NOT NULL AUTO_INCREMENT,`lastname` varchar(20) NOT NULL,`team_id` int(6) NOT NULL,PRIMARY KEY (`id`),KEY `player's team` (`team_id`),CONSTRAINT `player's team` FOREIGN KEY (`team_id`) REFERENCES `teams` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

下一步是创建POJO:

import java.util.Set;import javax.persistence.*;@Entity
@Table(name = 'teams')
public class Team {@Id@GeneratedValueprivate Integer id;private String name;@OneToMany(mappedBy='team', cascade=CascadeType.ALL)private Setplayers;public Team(String name) {this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public SetgetPlayers() {return players;}public void setPlayers(Setplayers) {this.players = players;}
}

我使用@OneToMany是因为一个团队可以拥有许多球员。 在下一个POJO中,关联将为@ManyToOne,因为许多球员可以为一个团队效力。

import javax.persistence.*;@Entity
@Table(name = 'players')
public class Player {@Id@GeneratedValueprivate Integer id;private String lastname;@ManyToOne@JoinColumn(name = 'team_id')private Team team;public Player(String lastname) {this.lastname = lastname;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getLastname() {return lastname;}public void setLastname(String lastname) {this.lastname = lastname;}public Team getTeam() {return team;}public void setTeam(Team team) {this.team = team;}
}

在这里,我指定将从拥有方( Teams )连接的列( team_id )。 注意,我没有在POJO中声明team_id字段。 如果我需要为球员更换球队,我只需要使用setTeam(Team team) setter。

声明POJO之后,我可以演示如何持久化它们:

...public static void main(String[] args) {SessionFactory sessionFactory = HibernateUtil.getSessionFactory();Session session = sessionFactory.openSession();session.beginTransaction();Team team = new Team('Barcelona');Setplayers = new HashSet();Player p1 = new Player('Messi');Player p2 = new Player('Xavi');p1.setTeam(team);p2.setTeam(team);players.add(p1);players.add(p2);team.setPlayers(players);session.save(team);session.getTransaction().commit();session.close();}
...

代码执行的结果是:

休眠:插入团队(名称)值(?)
休眠:插入玩家(姓氏,team_id)值(?,?)
休眠:插入玩家(姓氏,team_id)值(?,?)

就是这样,在本教程中,我演示了如何设置“ 一对多 ”和“ 多对一 ”双向关联。 在同一个教程中,单向关联的示例没有任何意义。 因为Hibernate具有自己的最佳实践:

单向关联更难以查询。 在大型应用程序中,查询中的几乎所有关联都必须在两个方向上都是可导航的。

参考: Fruzenshtein的笔记博客中来自我们的JCG合作伙伴 Alex Fruzenshtein的双向@OneToMany / @ManyToOne协会 。

翻译自: https://www.javacodegeeks.com/2013/03/bidirectional-onetomany-manytoone-association.html

双向@OneToMany / @ManyToOne关联相关推荐

  1. Hibernate双向多对多关联

    一.配置双向多对多关联 以Project类(项目)和Emp类(员工)为例: 1.创建Project类,并需要定义集合类型的Emp属性 public class Project {//编号private ...

  2. one-to-many many-to-one 为什么只生成了一张表呢?

    one-to-many & many-to-one 为什么只生成了一张表呢? 相信我在你mapping-resources没有添加hbm.xml出错的话,多半是版本问题. 研究了半天发现,原来 ...

  3. 【学习打卡】OneToMany对象关联查询

    课程内容: 今天学习的内容包括: 学习MyBatis中OneToMany对象关联查询的原理和使用方法. 通过例子实践OneToMany对象关联查询. 课程收获: 学习了数据库中常见的表与表的关系,如1 ...

  4. 注解@OneToMany@ManyToOne和@ManyToMany的使用总结

    0 背景 项目中用到@OneToMany.@ManyToOne和@ManyToMany,以评论和回复为例(一个评论会有多条回复),按照映射策略,分为外键关联.表关联和默认关联.总结它们的使用方法如下: ...

  5. @OnetoOne @OnetoMany @ManyToOne(2)

    在班主任(id,name,bjid) 班级(id name) 学生(id name bjid)的 关系中 班主任一对一关联班级 班级一对多关联学生 @OnetoOne  @joinColumn(bji ...

  6. JPA中@OneToMany @ManyToOne删除问题

    JPA中使用@OneToMany维护"一"对"多"的关系时,需要在"一"端的@OneToMany上配置一个关键参数orphanRemoval ...

  7. Hibernate关系映射 一对一双向外键关联@OneToOne Annotation方式

    首先还是来构造一个实际应用的场景,比如实体类车辆(Car),它具有以下属性:Id,品牌(brand),车牌(lisencePlate):实体类车牌(LisencePlate),它具有以下属性:Id,号 ...

  8. UML类图中的六大关系:关联(单向、双向、自关联)、聚合、组合、依赖、继承、实现

    一.类的属性的表示方式 在UML类图中,类使用包含类名.属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个A类,它包含c.d两个属性,以及methodA方法. 那么 ...

  9. hibernate 双向一对多 关联在多端维护

    作者:xyzroundo 如果在"一"一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多  的一端来维护关联关系

最新文章

  1. Vim - 编辑多个文件
  2. Python引起的混乱解决之道——感悟
  3. 容器技术的落地还要依靠SDN
  4. Synergy如果timeout的可能原因
  5. java sql 结果_Java中的SQL结果集
  6. 聊聊、Highcharts 动态数据
  7. [Kaggle] Spam/Ham Email Classification 垃圾邮件分类(BERT)
  8. 阿里重磅开源首款自研科学计算引擎Mars,揭秘超大规模科学计算
  9. amie 规则挖掘_AMIE的完整形式是什么?
  10. java的list和数组谁高效_java 中ArrayList与LinkedList性能比较
  11. BATJ等大厂最全经典面试题分享
  12. 鸿蒙2.0 134个仓库扼要说明
  13. 为什么光合作用要叶绿素?
  14. fork()创建子进程步骤、函数用法及常见考点(内附fork()过程图)
  15. 长春有学计算机的中专吗,长春比较好的中专学校
  16. 博后招募 | 香港大学蒋海波齐晓娟教授联合招收AI4Science方向博士后/RA
  17. android安全漏洞(八)伪造短信(利用原生android4.0漏洞)
  18. 指向字符串的指针 ------ 字符串指针
  19. layui动态表格下拉菜单
  20. java图形验证码识别-阿里云OCR(精准率50%)

热门文章

  1. leetcode初级算法3.存在重复元素
  2. Spring boot(七):Spring boot+ mybatis 多数据源最简解决方案
  3. java 反射api_反射是最重要的Java API
  4. vim 命令模式 筛选_10个步骤的筛选器模式
  5. java orm框架有哪些_Java Stream ORM现在带有JOIN
  6. log4j2自动删除_登录样式:log4j 2,上下文,自动清除…全部不附带任何字符串!...
  7. jsf netbeans_NetBeans Java EE技巧9:从数据库创建JSF应用程序
  8. java 8 lambda_异常作弊– Java 8 Lambdas
  9. hadoop lambda_Delta架构:统一Lambda架构并利用Hadoop / REST中的Storm
  10. sap寄售退货单_多个退货单