Hibernate的关联关系注解映射(一对一、一对多、多对一、多对多、自连接) 标签: hibernateentity 2016-10-11 16:28 1635人阅读 评论(0) 收藏 举报 分类
2017-08-09 09:11
726 查看
hibernate注解的关联关系映射,分为2种,即单向关联映射和双向关联映射,它们最大的区别就是在查询数据时,单向关联只能通过一边进行查询,而双向关联两边都可以进行查询。
单向关联是指只在一方加上注解,
双向关联是指双方都加上注解。这里主要记录双向关联。
1. 一对一关联:
如有2张表,公民表Person和身份证表IdCard
一方([b]IdCard):[/b]
@OneToOne(fetch=FetchType.LAZY,//延迟加载
targetEntity=IdCards.class,//目标对象
mappedBy="person",//指定由哪边维护关系(在这指有Person表维护,‘[b]person’指IdCards标中关联的Person对象)
cascade=CascadeType.ALL)[/b]
另一方(Person):
@OneToOne(fetch=FetchType.LAZY,
targetEntity=Person.class)//维护关系表
@JoinColumn(name="personId",referencedColumnName="personId",unique=true)
具体如下:
[java] view
plain copy
print?
@Entity
@Table(name = "tb_person")
public class Person implements Serializable {
private static final long serialVersionUID = 576770011136181361L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long personId;
[java] view
plain copy
print?
<span style="white-space:pre"> </span>@OneToOne(fetch=FetchType.LAZY,targetEntity=IdCards.class,mappedBy="person",cascade=CascadeType.ALL)
[java] view
plain copy
print?
<span style="white-space:pre"> </span>private IdCard idcard;
[java] view
plain copy
print?
[java] view
plain copy
print?
@Entity
@Table(name = "tb_idcard")
public class Idcard implements Serializable {
private static final long serialVersionUID = 576770011136181369L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long idcardId;
[java] view
plain copy
print?
<span style="white-space:pre"> </span>@OneToOne(fetch=FetchType.LAZY,
<span style="white-space:pre"> </span>targetEntity=Person.class)
<span style="white-space:pre"> </span>@JoinColumn(name="personId",referencedColumnName="personId",unique=true)
[java] view
plain copy
print?
<span style="white-space:pre"> </span>private Person person;
2. 一对多关系:
一方:
@OneToMany(fetch=FetchType.LAZY,
targetEntity=User.class,
cascade=CascadeType.ALL,
orphanRemoval=true,//孤儿删除
mappedBy="department")
[java] view
plain copy
print?
cascade=CascadeType.ALL,,即交由多的一方控制;
多方:
@ManyToOne(fetch = FetchType.LAZY,targetEntity = Department.class)@JoinColumn(name = "departmentId",referencedColumnName="departmentId")
[java] view
plain copy
print?
<span style="white-space:pre"> </span>如:一个用户只能属于一个部门,一个部门里可以有很多用户,其注解如下,
[java] view
plain copy
print?
部门实体类:
@Entity
@Table(name = "tb_department")
public class Department implements Serializable {
private static final long serialVersionUID = -3489189232910430049L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long departmentId;
private String name;
private String description;
[java] view
plain copy
print?
<span style="white-space:pre"> </span>@OneToMany(fetch=FetchType.LAZY,targetEntity=User.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="department")
<span style="white-space:pre"> </span>private Set<User> users;
........
}
[java] view
plain copy
print?
用户实体类:
@Entity
@Table(name="tb_user")
public class User implements Serializable {
private static final long serialVersionUID = 576770011136181361L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long userId;
<span style="white-space:pre"> </span>@ManyToOne(fetch = FetchType.LAZY,targetEntity = Department.class)
<span style="white-space:pre"> </span>@JoinColumn(name = "departmentId",referencedColumnName="departmentId")
<span style="white-space:pre"> </span>private Department department;
private String loginName;
........
........
}
2. 多对多关系:
多方:
@ManyToMany(fetch=FetchType.LAZY,targetEntity=Role.class)@JoinTable(name = "tb_user_role", joinColumns = @JoinColumn(name = "userId",referencedColumnName="userId") , inverseJoinColumns
= @JoinColumn(name = "roleId",referencedColumnName="roleId"))
其中“[b]tb_user_role”是两者的关系表,由两者的主键ID组成。通过@JoinColumn(name = "userId")指定在关系表中的字段名。[/b]
另一个多方:
@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, cascade = CascadeType.ALL, mappedBy = "roles")
[java] view
plain copy
print?
joinColumns :指主表,inverseJoinColumns :指匹配表
即user-->role,则user是主表,role是匹配表
如:一个用户可以有多个角色,一个角色可以适用于多个用户。
[java] view
plain copy
print?
用户实体类:
@Entity
@Table(name="tb_user")
public class User implements Serializable {
private static final long serialVersionUID = 576770011136181361L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long userId;
private String loginName;
private String name;
private String gender;
private String phone;
private String email;
private String description;
@ManyToMany(fetch=FetchType.LAZY,targetEntity=Role.class)
[java] view
plain copy
print?
<span style="white-space:pre"> </span>@JoinTable(name = "tb_user_role", joinColumns = @JoinColumn(name = "userId",referencedColumnName="userId") ,
[java] view
plain copy
print?
<span style="white-space:pre"> </span>inverseJoinColumns = @JoinColumn(name = "roleId",referencedColumnName="roleId"))
<span style="white-space:pre"> </span>private Set<Role> roles = new HashSet<Role>();
[java] view
plain copy
print?
.....
[java] view
plain copy
print?
角色实体类:
@Entity
@Table(name = "tb_role")
public class Role implements Serializable {
private static final long serialVersionUID = -7625883839295666830L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long roleId;
private String name;
private String description;
@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, cascade = CascadeType.ALL, mappedBy = "roles")
<span style="white-space:pre"> </span>private Set<User> users = new HashSet<User>();
.....
.....
}
2. 自连接关系:
自连接一方:
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Department.class)
@JoinColumn(name = "parentId",referencedColumnName="departmentId")
自连接多方:
@OneToMany(fetch=FetchType.LAZY,targetEntity=Department.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="parent")
@OrderBy("departmentId ASC")
因为是自连接,在一个表里操作,表中要增加一个父类id,用户建立连接。
如:部门管理,一个部门可以有很多个下级部门,但是一个上级部门只能有一个上级部门,这时需要建立自连接。
[java] view
plain copy
print?
部门实体类::
@Entity
@Table(name = "tb_department")
public class Department implements Serializable {
private static final long serialVersionUID = -3489189232910430049L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long departmentId;
private String name;
private String description;
<span style="white-space:pre"> </span>@ManyToOne(fetch = FetchType.LAZY, targetEntity = Department.class)
<span style="white-space:pre"> </span>@JoinColumn(name = "parentId",referencedColumnName="departmentId")
<span style="white-space:pre"> </span>private Department parent;
<span style="white-space:pre"> </span>@OneToMany(fetch=FetchType.LAZY,targetEntity=Department.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="parent")
<span style="white-space:pre"> </span>@OrderBy("departmentId ASC")
<span style="white-space:pre"> </span>private Set<Department> children = new HashSet<Department>();
[java] view
plain copy
print?
<span style="white-space:pre"> </span>....
.....
}
单向关联是指只在一方加上注解,
双向关联是指双方都加上注解。这里主要记录双向关联。
1. 一对一关联:
如有2张表,公民表Person和身份证表IdCard
一方([b]IdCard):[/b]
@OneToOne(fetch=FetchType.LAZY,//延迟加载
targetEntity=IdCards.class,//目标对象
mappedBy="person",//指定由哪边维护关系(在这指有Person表维护,‘[b]person’指IdCards标中关联的Person对象)
cascade=CascadeType.ALL)[/b]
另一方(Person):
@OneToOne(fetch=FetchType.LAZY,
targetEntity=Person.class)//维护关系表
@JoinColumn(name="personId",referencedColumnName="personId",unique=true)
具体如下:
[java] view
plain copy
print?
@Entity
@Table(name = "tb_person")
public class Person implements Serializable {
private static final long serialVersionUID = 576770011136181361L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long personId;
[java] view
plain copy
print?
<span style="white-space:pre"> </span>@OneToOne(fetch=FetchType.LAZY,targetEntity=IdCards.class,mappedBy="person",cascade=CascadeType.ALL)
[java] view
plain copy
print?
<span style="white-space:pre"> </span>private IdCard idcard;
[java] view
plain copy
print?
[java] view
plain copy
print?
@Entity
@Table(name = "tb_idcard")
public class Idcard implements Serializable {
private static final long serialVersionUID = 576770011136181369L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long idcardId;
[java] view
plain copy
print?
<span style="white-space:pre"> </span>@OneToOne(fetch=FetchType.LAZY,
<span style="white-space:pre"> </span>targetEntity=Person.class)
<span style="white-space:pre"> </span>@JoinColumn(name="personId",referencedColumnName="personId",unique=true)
[java] view
plain copy
print?
<span style="white-space:pre"> </span>private Person person;
2. 一对多关系:
一方:
@OneToMany(fetch=FetchType.LAZY,
targetEntity=User.class,
cascade=CascadeType.ALL,
orphanRemoval=true,//孤儿删除
mappedBy="department")
[java] view
plain copy
print?
cascade=CascadeType.ALL,,即交由多的一方控制;
多方:
@ManyToOne(fetch = FetchType.LAZY,targetEntity = Department.class)@JoinColumn(name = "departmentId",referencedColumnName="departmentId")
[java] view
plain copy
print?
<span style="white-space:pre"> </span>如:一个用户只能属于一个部门,一个部门里可以有很多用户,其注解如下,
[java] view
plain copy
print?
部门实体类:
@Entity
@Table(name = "tb_department")
public class Department implements Serializable {
private static final long serialVersionUID = -3489189232910430049L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long departmentId;
private String name;
private String description;
[java] view
plain copy
print?
<span style="white-space:pre"> </span>@OneToMany(fetch=FetchType.LAZY,targetEntity=User.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="department")
<span style="white-space:pre"> </span>private Set<User> users;
........
}
[java] view
plain copy
print?
用户实体类:
@Entity
@Table(name="tb_user")
public class User implements Serializable {
private static final long serialVersionUID = 576770011136181361L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long userId;
<span style="white-space:pre"> </span>@ManyToOne(fetch = FetchType.LAZY,targetEntity = Department.class)
<span style="white-space:pre"> </span>@JoinColumn(name = "departmentId",referencedColumnName="departmentId")
<span style="white-space:pre"> </span>private Department department;
private String loginName;
........
........
}
2. 多对多关系:
多方:
@ManyToMany(fetch=FetchType.LAZY,targetEntity=Role.class)@JoinTable(name = "tb_user_role", joinColumns = @JoinColumn(name = "userId",referencedColumnName="userId") , inverseJoinColumns
= @JoinColumn(name = "roleId",referencedColumnName="roleId"))
其中“[b]tb_user_role”是两者的关系表,由两者的主键ID组成。通过@JoinColumn(name = "userId")指定在关系表中的字段名。[/b]
另一个多方:
@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, cascade = CascadeType.ALL, mappedBy = "roles")
[java] view
plain copy
print?
joinColumns :指主表,inverseJoinColumns :指匹配表
即user-->role,则user是主表,role是匹配表
如:一个用户可以有多个角色,一个角色可以适用于多个用户。
[java] view
plain copy
print?
用户实体类:
@Entity
@Table(name="tb_user")
public class User implements Serializable {
private static final long serialVersionUID = 576770011136181361L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long userId;
private String loginName;
private String name;
private String gender;
private String phone;
private String email;
private String description;
@ManyToMany(fetch=FetchType.LAZY,targetEntity=Role.class)
[java] view
plain copy
print?
<span style="white-space:pre"> </span>@JoinTable(name = "tb_user_role", joinColumns = @JoinColumn(name = "userId",referencedColumnName="userId") ,
[java] view
plain copy
print?
<span style="white-space:pre"> </span>inverseJoinColumns = @JoinColumn(name = "roleId",referencedColumnName="roleId"))
<span style="white-space:pre"> </span>private Set<Role> roles = new HashSet<Role>();
[java] view
plain copy
print?
.....
[java] view
plain copy
print?
角色实体类:
@Entity
@Table(name = "tb_role")
public class Role implements Serializable {
private static final long serialVersionUID = -7625883839295666830L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long roleId;
private String name;
private String description;
@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, cascade = CascadeType.ALL, mappedBy = "roles")
<span style="white-space:pre"> </span>private Set<User> users = new HashSet<User>();
.....
.....
}
2. 自连接关系:
自连接一方:
@ManyToOne(fetch = FetchType.LAZY, targetEntity = Department.class)
@JoinColumn(name = "parentId",referencedColumnName="departmentId")
自连接多方:
@OneToMany(fetch=FetchType.LAZY,targetEntity=Department.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="parent")
@OrderBy("departmentId ASC")
因为是自连接,在一个表里操作,表中要增加一个父类id,用户建立连接。
如:部门管理,一个部门可以有很多个下级部门,但是一个上级部门只能有一个上级部门,这时需要建立自连接。
[java] view
plain copy
print?
部门实体类::
@Entity
@Table(name = "tb_department")
public class Department implements Serializable {
private static final long serialVersionUID = -3489189232910430049L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long departmentId;
private String name;
private String description;
<span style="white-space:pre"> </span>@ManyToOne(fetch = FetchType.LAZY, targetEntity = Department.class)
<span style="white-space:pre"> </span>@JoinColumn(name = "parentId",referencedColumnName="departmentId")
<span style="white-space:pre"> </span>private Department parent;
<span style="white-space:pre"> </span>@OneToMany(fetch=FetchType.LAZY,targetEntity=Department.class,cascade=CascadeType.ALL,orphanRemoval=true,mappedBy="parent")
<span style="white-space:pre"> </span>@OrderBy("departmentId ASC")
<span style="white-space:pre"> </span>private Set<Department> children = new HashSet<Department>();
[java] view
plain copy
print?
<span style="white-space:pre"> </span>....
.....
}
相关文章推荐
- hibernate学习-实体类与数据库表映射 分类: Hibernate 2012-11-01 17:21 541人阅读 评论(0) 收藏 举报 1.根据实体类名获取表名 Map<String, A
- Android自定义控件系列二:自定义开关按钮(一) 标签: Android自定义控件Java开关按钮自定义组件 2014-11-03 10:55 2735人阅读 评论(6) 收藏 举报 分类: J
- Hibernate的关联关系注解映射(一对一、一对多、多对一、多对多、自连接)
- Android 快速开发系列 ORMLite 框架最佳实践 标签: AndroidORMLite 2014-09-07 23:47 62916人阅读 评论(36) 收藏 举报 分类: 【Androi
- iOS大文件分片上传和断点续传 标签: iOS大文件分片断点续传获取视频获取图片 2016-05-17 15:52 4881人阅读 评论(8) 收藏 举报 分类: 技术—iOS 版权声明:本文为博
- Gradle命令和配置 标签: AndroidGradle命令配置 2016-03-11 09:32 17174人阅读 评论(5) 收藏 举报 分类: 开发工具(9) 版权声明:本文为博主原创文
- Android Gradle 多版本多APK打包,修改生成APK名称 标签: androidgradle多版本打包 2017-04-01 15:16 1113人阅读 评论(0) 收藏 举报 分类:
- MySQL添加新用户、为用户创建数据库、为新用户分配权限 标签: MySQL 2016-12-17 16:41 2768人阅读 评论(0) 收藏 举报 分类: =======学习心得=======
- Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说
- RxJava Android(RxAndroid) 开发全家桶 标签: RxAndroid 2016-08-03 23:38 4993人阅读 评论(0) 收藏 举报 分类: Android开发(1
- Intellij IDEA设置系列(四):各种乱码解决方案 标签: IntelliJ IDEA中文乱码 2016-04-10 17:03 8402人阅读 评论(5) 收藏 举报 分类: Intell
- 基于live555的rtsp 客户端模块优化 标签: live555rtsp客户端 2014-11-14 09:24 980人阅读 评论(0) 收藏 举报 分类: 流媒体(16) 版权声明:本文
- C++成员变量的初始化顺序 标签: C++成员变量初始化顺序 2017-02-22 23:44 101人阅读 评论(0) 收藏 举报 分类: C++程序设计浅尝(46) 原文地址:http://w
- 《Go语言入门》第一个Go语言程序——HelloWorld 标签: go语言helloworld 2015-11-29 18:46 4066人阅读 评论(4) 收藏 举报 分类: go语言入门(3)
- Mac OS 简易安装redis 标签: redisbrewserverclientMacOS 2016-05-30 23:04 7813人阅读 评论(0) 收藏 举报 分类: Redis 版权声
- C++单例模式 标签: c++null设计模式多线程delete数据库 2010-07-29 10:08 10889人阅读 评论(3) 收藏 举报 分类: 设计模式(1) C/C++(43)
- Error LNK2001 无法解析的外部符号 的几种情况及解决办法 标签: mfc编译器编程c 2011-08-18 22:48 199753人阅读 评论(10) 收藏 举报 分类: Debug
- Tomcat 的三种(bio,nio.apr) 高级 Connector 运行模式 标签: tomcat 2016-09-06 11:28 2910人阅读 评论(0) 收藏 举报 分类: tomca
- wordpress修改固定链接之后 无法访问的解决办法 标签: WordPress 2015-09-24 14:09 223人阅读 评论(0) 收藏 举报 分类: WordPress(6) 本地同
- Android 中查看内存的使用情况集常用adb命令 标签: Androidadb 2014-06-28 10:55 57206人阅读 评论(0) 收藏 举报 分类: Android(9) 版权声