Hibernate一对多、多对一关联

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

示例: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(多方)维护的。

Hibernate一对多、多对一关联

时间: 2024-08-02 02:50:29

Hibernate一对多、多对一关联的相关文章

Hibernate ManyToOne Mappings 多对一关联映射

Hibernate框架的使用步骤: 1.创建Hibernate的配置文件(hibernate.cfg.xml) 2.创建持久化类,即其实例需要保存到数据库中的类(Employee.java) 3.创建对象-关系映射文件(Employee.hbm.xml) 4.通过Hibernate API编写访问数据库的代码 例子:多个员工对应一个地址. 一.创建hibernate.cfg.xml 配置文件: 注意数据库名.用户名.密码是否填写正确. <?xml version="1.0" en

hibernate 一对多|多对一

一对多:(一个客户对应多个联系人) 客户实体:Customer.java package cn.future.domain; import java.util.HashSet; import java.util.Set; public class Customer { /* * CREATE TABLE `cst_customer` ( `cust_id` BIGINT(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)', `cust_name` VAR

Hibernate一对多(多对一)关联关系

上一篇博文总结了 Hibernate 的一对一的关联关系, 包括基于主键的单向一对一, 基于外键的单向一对一, 基于外键的双向一对一. 下面咱们说一下 Hibernate 的一对多关联关系. 其实一对多和多对一是一样的, 一对多反过来想就是多对一了. Hibernate的一对多可分为: 1. 单向一对多. 2. 双向一对多. OneByOne 一: 单向一对多 准备工作: 咱们以 客户(Customer) 和 订单(Order) 的例子来说, 一个客户可以有多个订单, 但是一个订单只能属于一个客

精通Hibernate——建立单向多对一关联

在类与类之间各种各样的关系中,要算多对一的单向关联关系和关系数据库中的外键参照关系最匹配了.因此,通常选择从Order到Customer的多对一单向关联.简要代码如下: public class Customer implements Serializable{ private Long id; private String name; .... } public class Order implements Serializable{ private Long id; private Stri

Hibernate之实现多对多关联映射关系

直接以老师与学生的关系为例.在多对多关联关系中,其中一方都可通过Set保留另一方的所有信息,这样的关联是双向关联.在多对多关联关系中,也只能是双向关联.老师和学生分别对应一张表,通过一张有双方id的中间表来维护多对多的关联. 实体类 package test.hibernate.hbmManyToMany; import java.util.HashSet; import java.util.Set; public class Teacher { private Integer id; priv

hibernate 一对多的单项关联-表的搭建

班级的映射关系表         <?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"&g

Hibernate框架单向多对一关联映射关系

建立多对一的单向关联关系    Emp.java            private Integer empNo //员工编号            private String empName //员工姓名            //private Integer deptNo;  //部门编号            private Dept dept;    //所属部门    Dept.java            private Byte deptNo;              

6.Hibernate单向的多对一 关联映射

1.创建如下项目结构 2.在项目的src下创建hibernate.cfg.xml主配置文件 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.

hibernate一对多等情况关联查询效率低的解决方法

方法就是设置lazy=true 其实整个项目在接手时已经搭建好框架,数据库采用的是MySQL.客户运行了一年多时间,速度越来越慢.加上最近新开发的功能,速度已经不能让人接受. 先解决了MySQL远程访问速度问题,效果有了变化,但是依旧不能让人接受.后加功能都是自己亲手建的表,从数据库上杜绝了外键(个人不喜欢),没想到的是之前的表全是外键,而且有很多...设计不合理.废话不多说了,讲一讲改变后和之前的变化.之前页面加载10S,测试得分是0分,伤心的要死.改变之后是1s,得分88分.....好了不多

SSH学习六 Hibernate 一对多 多对一的双向映射

其实就是前面两个的结合 Student里面有Teacher类作为成员,映射文件加上对teacherid的外键参照 Teacher里面有Student的Set,映射文件有set标签,里面声明one-to-many以及key 结合http://blog.csdn.net/u011026968/article/details/47154059 http://blog.csdn.net/u011026968/article/details/47156979 即可 版权声明:本文为博主原创文章,未经博主允