一对多、多对一关联:在多方加外键

示例:Group(一方)和User(多方),一个Group可以有多个User,每个User只能属于一个Group

 

多对一单向关联

在User(多方)中建Group(一方)对象,并添加@ManyToOne注解

1.建Group实体类和User实体类,添加Annotation注解,如下

@Entity
@Table(name="_group") //group在MySQL中是关键字,不能直接做表名
public class Group {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

 

@Entity
@Table(name="_user") //为了和表_group保持一致,也用一个别名
public class User {
private int id;
private String name; private Group group; @Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} @ManyToOne //多对一关联
// @JoinColumn(name="groupId") //任意指定生成的外键名
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
}

 

2.在hibernate.cfg.xml中添加mapping语句

<mapping class="com.hibernate.model.Group"/>
<mapping class="com.hibernate.model.User"/>

3.建Junit测试类

public class ORMappingTest {

	@Test
public void test() {
new SchemaExport(new Configuration().configure()).create(true, true);
}
}

程序至此结束,运行程序,在数据库中生成表_group和表_user,并在控制台输出建表语句。

_user表中会自动生成属性名为group_id的外键,可用@JoinColumn注解修改其属性名

 

一对多单向关联

在Group(一方)中建User(多方)对象,此对象采用Set集合形式

并添加@ManyToOne和@JoinColumn注解(必须添加)

1.建Group实体类和User实体类,添加Annotation注解,如下

@Entity
@Table(name="_group") //group在MySQL中是关键字,不能直接做表名
public class Group {
private int id;
private String name; private Set<User> users = new HashSet<User>(); //新建Set集合形式的多方对象users @Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} @OneToMany //一对多关联
@JoinColumn(name="groupId") //若不添加该属性,则会在数据库中生成三张表。
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}

 

@Entity
@Table(name="_user") //为了和表_group保持一致,也用一个别名
public class User {
private int id;
private String name; @Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

2.在hibernate.cfg.xml中添加mapping语句----同上

3.建Junit测试类----同上

程序至此结束,运行程序,会在数据库中生成表_group和表_user,并在控制台输出建表语句

_user表中会生成指定属性名的外键

 

一对多、多对一双向关联

在User中建Group对象,并添加@ManyToOne注解;在Group中建User对象,并添加@OneToMany注解

1.建Group实体类和User实体类,添加Annotation注解

User类同“多对一单向关联”部分的User类

Group类,如下:

@Entity
@Table(name="_group") //group在MySQL中是关键字,不能直接做表名
public class Group {
private int id;
private String name; private Set<User> users = new HashSet<User>(); @Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} @OneToMany(mappedBy="group") //这里的"group"是指User类中的private Group group;
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}

 

2.在hibernate.cfg.xml中添加mapping语句----同上

3.建Junit测试类----同上

程序至此结束,

运行程序,会在数据库中生成表_group和表_user,并在控制台输出建表语句

_user表中会自动生成属性名为group_id的外键,可用@JoinColumn注解修改其属性名

 

@mappedBy含义

1.单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段

2.只有OneToOne,OneToMany,ManyToMany上才有mappedBy属性,ManyToOne不存在该属性

3.mappedBy跟JoinColumn/JoinTable总是处于互斥的一方

 

以Group(一方)和User(多方)为例,

外键在User(多方),@JoinColumn/@JoinTable则只能设置在User(多方)。

则@mappedBy设置在Group(一方)。表明此关联关系是由User(多方)维护的。

最新文章

  1. JavaScript一词被《牛津大词典》收录了
  2. 遍历PspCidTable表检测隐藏进程
  3. good books
  4. C#正则表达式分组使用
  5. 插件介绍 :cropper是一款使用简单且功能强大的图片剪裁jQuery插件。
  6. 04737_C++程序设计_第2章_从结构到类的演变
  7. java程序获得SqlServer数据表的表结构
  8. linux服务器没网情况下手动安装软件几个方法
  9. PHP实现仿Google分页效果的分页函数
  10. Django REST FrameWork中文教程2:请求和响应
  11. 使用Identity Server 4建立Authorization Server (3)
  12. 线上平滑升级nginx1.12
  13. mysql 在B数据库下 创建一个与A数据库中一样的表
  14. 2018年web前端学习路线图
  15. Lua“控制”C
  16. Linux学习---位运算符
  17. python之多线程通信
  18. spring cloud 版本号与 boot版本之间的对应关系(版本不对,会导致pom无法引入)
  19. 我正在参加 CSDN 2018 年博客之星评选,希望大家能支持我
  20. C# 将 Stream 写入文件

热门文章

  1. App打包上架流程(iOS转)
  2. Yarn源码分析之如何确定作业运行方式Uber or Non-Uber?
  3. 几种垃圾回收GC概述
  4. Oracle----oracle小知识总结
  5. iframe定位获取
  6. Redis 在windows中启动
  7. Python如何利用多核处理器
  8. eclipse下设置tomcat,修改Java代码不必重启tomcat
  9. 关于自我总结的html5新特性
  10. exe4j中&quot;this executable was created with an evaluation version of exe4j&quot;