Hibernate 基础配置及常用功能(二)
本章主要是描述几种经典映射关系,顺带比较Hibernate4.x和Hibernate5.x之间的区别。
一、建立测试工程目录
有关实体类之间的相互映射关系,Hibernate官方文档其实描述的非常详细,这里只提供几种常见映射。(推荐4.3.11版本的 hibernate-release-4.3.11.Final\documentation\manual)
二、编写映射关系
(1)one2one单表内嵌映射:
packagemodel.family;importjavax.persistence.Embedded;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;@Entitypublic classHusband {private intid;privateString husbandName;privateWife wife;@Id@GeneratedValuepublic intgetId() {returnid;}public void setId(intid) {this.id =id;}publicString getHusbandName() {returnhusbandName;}public voidsetHusbandName(String husbandName) {this.husbandName =husbandName;}//两个实体对象共用一张数据表,提高查询速度 @EmbeddedpublicWife getWife() {returnwife;}public voidsetWife(Wife wife) {this.wife =wife;}}
Husband.java
packagemodel.family;//不用添加任何注解,持久化过程通过主表完成 public classWife {privateString wifeName;publicString getWifeName() {returnwifeName;}public voidsetWifeName(String wifeName) {this.wifeName =wifeName;} }
Wife.java
(2)one2one外键映射:
packagemodel.userinfo;importjavax.persistence.CascadeType;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.OneToOne;importjavax.persistence.Transient;@Entitypublic classUser {private intid;privateString username;privateString password;privateString confirm;privateInformation info;@Id@GeneratedValuepublic intgetId() {returnid;}public void setId(intid) {this.id =id;}publicString getUsername() {returnusername;}public voidsetUsername(String username) {this.username =username;}publicString getPassword() {returnpassword;}public voidsetPassword(String password) {this.password =password;}/** 延迟加载,级联操作。 * 删除开启了级联的一方,被级联的一方也会被删除* 注意:如果session的操作是通过hibernate控制,延迟加载不会出问题。如果是通过手工开启实物,操作不当延迟加载可能抛出懒加载异常*/@OneToOne(fetch= FetchType.LAZY, mappedBy = "user", cascade =CascadeType.ALL)publicInformation getInfo() {returninfo;}public voidsetInfo(Information info) {this.info =info;}//本字段不参与持久化过程 @TransientpublicString getConfirm() {returnconfirm;}public voidsetConfirm(String confirm) {this.confirm =confirm;} }
User.java
packagemodel.userinfo;importjava.util.Date;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.OneToOne;importjavax.persistence.Temporal;importjavax.persistence.TemporalType;//注解也可以直接配置在字段上,但是不推荐。据说原因是可能破坏oop封装。但是我觉得有时这样配置可以让代码显得更加整洁,特别是在Spring中。 @Entitypublic classInformation {@Id@GeneratedValueprivate intid;@OneToOneprivateUser user;@Temporal(TemporalType.DATE)privateDate resgisterDate;privateString address;public intgetId() {returnid;}public void setId(intid) {this.id =id;}publicUser getUser() {returnuser;}public voidsetUser(User user) {this.user =user;}publicDate getResgisterDate() {returnresgisterDate;}public voidsetResgisterDate(Date resgisterDate) {this.resgisterDate =resgisterDate;}publicString getAddress() {returnaddress;}public voidsetAddress(String address) {this.address =address;}}
Information.java
(3)many2many多表映射:
场景描述:学校里有多个老师,每个老师教授多个学生,每个学生每一门课程会有一个得分。
packagemodel.school;importjava.util.HashSet;importjava.util.Set;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.ManyToMany;@Entitypublic classTeacher {private intid;privateString tchName;private Set<Student> students = new HashSet<Student>();@Id@GeneratedValuepublic intgetId() {returnid;}public void setId(intid) {this.id =id;}publicString getTchName() {returntchName;}public voidsetTchName(String tchName) {this.tchName =tchName;}//老师和学生的对应表由学生一方负责维护@ManyToMany(mappedBy = "teachers")public Set<Student>getStudents() {returnstudents;}public void setStudents(Set<Student>students) {this.students =students;}}
Teacher.java
packagemodel.school;importjava.util.HashSet;importjava.util.Set;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.JoinTable;importjavax.persistence.ManyToMany;importjavax.persistence.OneToMany;@Entitypublic classStudent {private intid;privateString stuName;private Set<Teacher> teachers = new HashSet<Teacher>();private Set<Score> scores = new HashSet<Score>();@Id@GeneratedValuepublic intgetId() {returnid;}public void setId(intid) {this.id =id;}publicString getStuName() {returnstuName;}public voidsetStuName(String stuName) {this.stuName =stuName;}/** many2many必须使用中间表,配置中间表的表明和列名*/@ManyToMany@JoinTable(name= "student_teacher", joinColumns = { @JoinColumn(name = "studentId") }, inverseJoinColumns ={@JoinColumn(name= "teacherId") })public Set<Teacher>getTeachers() {returnteachers;}public void setTeachers(Set<Teacher>teachers) {this.teachers =teachers;}//学生同分数之间的关系同样交给多的一方负责维护@OneToMany(mappedBy = "student")public Set<Score>getScores() {returnscores;}public void setScores(Set<Score>scores) {this.scores =scores;}}
Student.java
packagemodel.school;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.ManyToOne;@Entitypublic classScore {private intid;private intcourseScore;privateTeacher teacher;privateStudent student;@Id@GeneratedValuepublic intgetId() {returnid;}public void setId(intid) {this.id =id;}public intgetCourseScore() {returncourseScore;}public void setCourseScore(intcourseScore) {this.courseScore =courseScore;}@ManyToOnepublicTeacher getTeacher() {returnteacher;}public voidsetTeacher(Teacher teacher) {this.teacher =teacher;}@ManyToOnepublicStudent getStudent() {returnstudent;}public voidsetStudent(Student student) {this.student =student;}}
Score.java
按照以上的映射关系生成数据表以后会注意到,其实老师和学生之间的关系表纯粹多余,分数表已经维护了双方的关系。重新优化他们之间的映射关系:
packagemodel.school;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;@Entitypublic classTeacher {private intid;privateString tchName;@Id@GeneratedValuepublic intgetId() {returnid;}public void setId(intid) {this.id =id;}publicString getTchName() {returntchName;}public voidsetTchName(String tchName) {this.tchName =tchName;}}
Teacher.java
packagemodel.school;importjava.util.HashSet;importjava.util.Set;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.OneToMany;@Entitypublic classStudent {private intid;privateString stuName;private Set<Score> scores = new HashSet<Score>();@Id@GeneratedValuepublic intgetId() {returnid;}public void setId(intid) {this.id =id;}publicString getStuName() {returnstuName;}public voidsetStuName(String stuName) {this.stuName =stuName;}@OneToMany(mappedBy= "student")public Set<Score>getScores() {returnscores;}public void setScores(Set<Score>scores) {this.scores =scores;}}
Student.java
packagemodel.school;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.ManyToOne;@Entitypublic classScore {private intid;private intcourseScore;privateTeacher teacher;privateStudent student;@Id@GeneratedValuepublic intgetId() {returnid;}public void setId(intid) {this.id =id;}public intgetCourseScore() {returncourseScore;}public void setCourseScore(intcourseScore) {this.courseScore =courseScore;}@ManyToOnepublicTeacher getTeacher() {returnteacher;}public voidsetTeacher(Teacher teacher) {this.teacher =teacher;}@ManyToOnepublicStudent getStudent() {returnstudent;}public voidsetStudent(Student student) {this.student =student;}}
Score.java
由此可见,即使是一个相对复杂的映射关系也可以通过优化得到一个相对简单的数据模型。
(4)many2one和one2many单表树形映射:
场景描述:地图,一个国家包含多个省份,每个省份又包含多个城市...
packagemodel.tree;importjava.util.HashSet;importjava.util.Set;importjavax.persistence.CascadeType;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.ManyToOne;importjavax.persistence.OneToMany;importjavax.persistence.Table;@Entity @Table(name= "_tree")public classTree {private intid;privateString name;privateTree parent;private Set<Tree> children = new HashSet<Tree>();@Id@GeneratedValuepublic intgetId() {returnid;}public void setId(intid) {this.id =id;}@Column(name= "t_name", unique = true)publicString getName() {returnname;}public voidsetName(String name) {this.name =name;}@ManyToOnepublicTree getParent() {returnparent;}public voidsetParent(Tree parent) {this.parent =parent;}//删除根节点,与它相关的所有子节点全部删除@OneToMany(mappedBy = "parent", cascade =CascadeType.ALL)public Set<Tree>getChildren() {returnchildren;}public void setChildren(Set<Tree>children) {this.children =children;} }
Tree.java
注意:以上4种映射关系在4.3.11版本中正常。但在5.0.6版本中id字段被系统强制指定为了@GeneratedValue(strategy=GenerationType.TABLE)的方式。我曾经尝试手工指定生成策略为auto或者identity均无效。如果是通过xml的方式配置是正常的,目前我还不清楚是什么原因导致的上述异常。这个问题造成了下面的映射关系目前只能在4.x版本中正常使用:
(5)one2one主键映射
packagemodel.personaddr;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.OneToOne;importjavax.persistence.PrimaryKeyJoinColumn;@Entitypublic classPerson {private intid;privateString name;privateAddress address;@Id@GeneratedValuepublic intgetId() {returnid;}public void setId(intid) {this.id =id;}publicString getName() {returnname;}public voidsetName(String name) {this.name =name;}//两张表通过主键关联@OneToOne(optional = true)@PrimaryKeyJoinColumnpublicAddress getAddress() {returnaddress;}public voidsetAddress(Address address) {this.address =address;} }
Person.java
packagemodel.personaddr;importjavax.persistence.Entity;importjavax.persistence.GeneratedValue;importjavax.persistence.Id;importjavax.persistence.OneToOne;@Entitypublic classAddress {private intid;privateString local;privatePerson person;@Id@GeneratedValuepublic intgetId() {returnid;}public void setId(intid) {this.id =id;}publicString getLocal() {returnlocal;}public voidsetLocal(String local) {this.local =local;}@OneToOne(mappedBy= "address")publicPerson getPerson() {returnperson;}public voidsetPerson(Person person) {this.person =person;}}
Address.java
ps:好在主键映射在实际使用中并不常见。
最后按照惯例,提供整个项目的完整目录结构和IDE版本信息
转载于:https://www.cnblogs.com/learnhow/p/5120948.html
Hibernate 基础配置及常用功能(二)相关推荐
- 3D游戏建模入门基础:3dmax常用功能详解
你收藏了那么多教程,却不知道3dmax怎么入门?掌握3dmax常用功能是3dmax入门的基础之一,所以呢小编今天就为您盘点了一些3dmax最常用到的功能和使用方法,快来和小编一起学习3dmax入门基础 ...
- Web基础配置篇(十二): Elasticsearch的安装配置及入门使用
Web基础配置篇(十二): Elasticsearch的安装配置及入门使用 一.概述 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RE ...
- Fedora 28 系统基础配置以及常用软件安装方式
实验说明: 很多人说Linux很难用,很难上手,其实不然,倘若不玩游戏,其实很多发行版Linux都可以成为主力系统,就比如本章要讲的 Fedora 28.本章会从镜像来源.系统安装.基础配置和常用软件 ...
- 基于Zotero和坚果云的大规模文献同步管理环境配置及常用功能介绍(超详细)
本博客主要介绍如何基于Zotero.坚果云配置大规模文献同步管理环境,此外还介绍Zotero的常用功能. 1. 环境配置 1.1 Zotero客户端下载及安装 在Zotero官网选择适合自己操作系统的 ...
- nginx 基础配置和常用模块
这两天在看nginx的东西,下面是学习过程中学习到东西,贴了出来若有哪里不对请大家给予指正. 一:nginx安装: ./configure --prefix=/usr/local/nginx/ ma ...
- 思科网络基础配置命令大全(二)
[欢迎关注微信公众号:厦门微思网络] 一.静态路由 Ip route x.x.x.x(网段) x.x.x.x( 子网掩码) x.x.x.x/出接口(下一跳) (尽量用下一跳地址,出接口会产生 AR ...
- 3dmax基础知识:3dmax常用功能详解,零基础小白的福音
你收藏了那么多教程,却不知道3dmax怎么入门?掌握3dmax常用功能是3dmax入门的基础之一,今天就为您盘点了一些3dmax最常用到的功能和使用方法,快来和小编一起学习3dmax入门基础知识吧! ...
- 从零开始学习jQuery (十) jQueryUI常用功能实战
本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...
- jQuery框架学习第十天:实战jQueryUI常用功能
jQuery框架学习第一天:开始认识jQuery jQuery框架学习第二天:jQuery中万能的选择器 jQuery框架学习第三天:如何管理jQuery包装集 jQuery框架学习第四天:使用jQ ...
最新文章
- Redis附加功能之键过期功能
- win32汇编获取当前进程ID和可执行文件名
- java条件配置,三、使用JAVA必备条件—环境配置
- 写了 30 万行基础设施代码后,我们得出 5 个有用的经验
- springcloud ribbon 配置负载均衡策略以及自定义策略
- 规则引擎Easy-rules
- python中的glob 模块学习文件路径查找
- SAE助力「海底小纵队学英语」全面拥抱Serverless,节省25%以上成本
- 数据库面试 - 如何设计可以动态扩容缩容的分库分表方案?
- 单纯形法只有两个约束条件_教学 | 线性规划 7 :单纯形法的引入
- 计算机网络学习笔记(4. Internet结构)
- JavaScript - textarea 滚动至顶部或底部
- 对比Ruby和Python的垃圾回收
- matplotlib-06 axhline绘制水平/竖直参考线
- 【毕业设计】病房无线呼叫系统 - stm32 单片机 物联网 嵌入式
- Service START_NOT_STICKY、START_STICKY
- jmu-python-最佳身高
- Office 2008 for Macintosh: The Missing Manual
- dnf服务器炸团门票怎么找回,DNF最新BUG,玩家打团买票后材料消失,无法引炸直接退队!...
- comsol—偏振光仿真
热门文章
- 【Java心得总结六】Java容器中——Collection
- MVC中不能使用原生态的#include ,可替代的解决方案
- foreach语句的的解析
- 扩展Asterisk1.8.7的CLI接口
- Effective Java第七条:避免使用终结方法
- python中matplotlib画图_Python-matplotlib画图(莫烦笔记)
- java监控rabbitMq服务状态,SpringCloud-Turbine【RabbitMQ服务监控】
- github删除文件_github 仓库中删除历史大文件
- linux etc 服务启动脚本,linux 服务脚本启动问题
- vue计算属性computed与监听属性watch的基本使用