Hibernate的关联映射——单向1-N关联
Hibernate的关联映射——单向1-N关联
单向1-N关联的持久化类里需要使用集合属性。因为1的一端需要访问N的一端,而N的一端将以集合(Set)形式表现。从这个意义上来看,1-N(实际上还包括N-N)和集合属性非常相似,只是此时集合里的元素是关联实体。
对于单向的1-N关联关系,只需要在1的一端增加Set类型的成员变量,该成员变量记录当前实体所有的关联实体,当然还要为这个Set类型的属性增加setter和getter方法。
为了映射1-N关联,需要使用@OneToMany注解。
1.无连接表的单向1-N关联
需要在N的一端添加外键列来维护关联关系,但由于程序此时只让1一端控制关联关系,因此直接在1的一端使用@JoinColumn修饰Set集合属性、映射外键列即可。
下面的Person实体可以关联多个Address实体。
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
/**
* 一个Person实例可以关联多个Address实例
*/
@Entity
@Table(name="person")
public class Person {
@Id @Column(name="p_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(name="p_name")
private String name;
@Column(name="p_age")
private Integer age;
//定义该Person实例所有关联的Address实体
@OneToMany(targetEntity=Address.class)
//映射外键列,此处映射的外键列将会添加到关联实体对应的数据表中,
//注意并不是添加到当前的实体对应的数据表中,而是关联实体对应的数据表中
@JoinColumn(name="p_id",referencedColumnName="p_id")
@Cascade(CascadeType.ALL)
private Set<Address> addresses = new HashSet<>();
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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Set<Address> getAddresses() {
return addresses;
}
public void setAddresses(Set<Address> addresses) {
this.addresses = addresses;
}
}
Address则不需要维护与Person类的关系,所以比较简单。
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="address_inf")
public class Address {
@Id @Column(name="address_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(name="address_name")
private String name;
public Address(){
}
public Address(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;
}
}
测试效果。
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.mytest.test1.HibernateUtil;
public class Test {
public static void main(String[] args) {
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
//创建一个Person对象
Person person = new Person();
//创建一个顺泰的Address对象
Address addressA = new Address("A");
//为Person对象设置值
person.setName("liujiang");
person.setAge(24);
//设置Person和Address之间的关联
person.getAddresses().add(addressA);
//持久化person对象
session.save(person);
//创建一个瞬态的Address对象
Address addressB = new Address("B");
//持久化addressB
session.persist(addressB);
//修改持久化状态的person对象
person.getAddresses().add(addressB);
tx.commit();
HibernateUtil.currentSession();
}
}
2.有连接表的单向1-N关联
对于有连接表的单向1-N关联,同样需要使用过@OneToMany修饰代表关联实体的集合属性。除此之外,程序还应该用@JoinTable显式指定连接表。
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="person2")
public class Person2 {
@Id @Column(name="p_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
@Column(name="p_name")
private String name;
@Column(name="p_age")
private Integer age;
//定义该Person实体所有关联的Address实体
@OneToMany(targetEntity=Address.class)
//映射连接表为person_address
@JoinTable(
name="person_address",
//定义连接表中名为“p_id”的外键列,该外键列参照当前实体对应表的主键列
joinColumns=@JoinColumn(
name="p_id",
referencedColumnName="p_id"
),
//定义连接表中名为address_id的外键列
//该外键列参照当前实体关联的实体对应表的主键列
inverseJoinColumns=@JoinColumn(
name="address_id",
referencedColumnName="p_id",
unique=true
)
)
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 Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Hibernate的关联映射——单向1-N关联的更多相关文章
- Hibernate的关联映射——单向1-1关联
Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...
- Hibernate的关联映射——单向N-1关联
Hibernate的关联映射--单向N-1关联 N-1是非常常见的关联关系,最常见的父子关系也是N-1关联,单向的N-1关联只需从N的一端可以访问1的一端. 为了让两个持久化类能够支持这种关联映射,程 ...
- hibernate之关于一对一单向,双向关联映射
[hibernate]之关于一对一单向,双向关联映射 首先我们来看,Hibernate官方对于一对一单向关联的解释: 基于外键关联的单向一对一关联和单向多对一关联差点儿是一样的. 唯一的不同就是单向一 ...
- 016 多对多关联映射 单向(many-to-many)
一般的设计中,多对多关联映射,需要一个中间表 Hibernate会自动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联 多对多的关联映射,在实体类中,跟一对多一样,也是 ...
- (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...
- 【Hibernate框架】关联映射(多对多关联映射)
按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...
- 014 一对多关联映射 单向(one-to-many)
在对象模型中,一对多的关联关系,使用集合来表示. 实例场景:班级对学生:Classes(班级)和Student(学生)之间是一对多的关系. 多对一.一对多的区别: 多对一关联映射:在多的端加入一个外键 ...
- Hibernate框架关系映射一对多双向关联
直入主题,首先大配置常规配置, 这里住要说关联关系,大配置不多少,而且jar包默认添加好,笔者用的是idea2016. 然后我们知道关联关系主要是在小配置添加节点来配置属性.个人认为关联映射,就是对应 ...
- 论坛:一对一关联映射/单向关联/两个类间,可以有两个(多个)关联关系/content为大文本类型/
>>单向:只写一端的映射属性,另一端不写(有一端用不着);双向:两端都写映射属性 >>一对一关联有两类:一类基于主键的(一般不使用),一类基于外键的(重点学习): 外键:是一个 ...
随机推荐
- oracle空间管理
表空间:组织数据文件的一种途径, 是一个逻辑概念 包含有 表,字段,索引 一个数据库可以对应多个表空间 一个物理文件对应一个表空间 任何一个数据库创建的第一一个表空间是 system Tables ...
- Android课程---String、StringBuffer 、StringBuilder 的区别(转)
String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主 ...
- DOM概述
<!-- DOM:Document Object Model 文档对象模型 用来将标记型文档封装成对象,并将标记型文档中的所有内容(标签,文本,属性等)都封装成对象 封装成对象的目的是为了更为方 ...
- Android开发之Intent略解
Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件.通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意 ...
- StringUtils.isEmpty和StringUtils.isBlank用法
StringUtils 方法的操作对象是 java.lang.String 类型的对象,是 JDK 提供的 String 类型操作方法的补充,并且是 null 安全的(即如果输入参数 String 为 ...
- Python常用模块之sys
Python常用模块之sys sys模块提供了一系列有关Python运行环境的变量和函数. 常见用法 sys.argv 可以用sys.argv获取当前正在执行的命令行参数的参数列表(list). 变量 ...
- LeetCode Number of Connected Components in an Undirected Graph
原题链接在这里:https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/ 题目: Giv ...
- mongoose index
1. 当应用程序启动时,Mongoose会自动为模式中的每个定义的索引调用ensureIndex. 虽然很好用于开发,但建议在生产中禁用此行为,因为索引创建可能会导致显着的性能影响. 通过将模式的au ...
- 使用百度编辑器时,报错:从客户端("...)中检测到有潜在危险的 Request.Form 值
ajax请求失败,提交不上去 起初没找到报错的这句话,可能由于我用了其他第三方插件的原因,后来改动了一下,出现了这个错误 然后百度得到答案:http://www.cnblogs.com/tearer/ ...
- 定时往oracle插入数据
1创建存储过程 create or replace procedure job_proc isbegininsert into yy (yid) values (sysdate);end; 2创建jo ...