Hibernate的关联映射——双向1-N关联
Hibernate的关联映射——双向1-N关联
对于1-N的关联,Hibernate推荐使用双向关联,而且不要让1的一端控制关联关系,而是用N的一端控制关联关系。双线的1-N关联和N-1关联是两种相同的情形,两端都需要增加对关联属性的访问,N的一端增加引用到关联实体的属性,1的一端增加集合属性,集合的元素为关联实体。
Hibernate对双向的1-N关联同样提供了有连接表和无连接表的两种关联映射策略。
1.无连接表的双向1-N关联
无连接表的双向1-N关联,N的一端需要增加@ManyToOne注解来修饰代表关联实体的属性,而1的一端则需要使用@OneToMany注解来修饰代表关联实体的属性。
底层数据库为了记录这种1-N关联关系,只需要在N的一端的数据表里添加一个外键列即可,因此应该在使用@ManyToOne注解的同时,使用@JoinColumn来映射外键列。
对于双向的1-N关联映射,通常不应该允许1的一端控制关联关系,而应该由N的一端控制关联关系,因此应该在使用@OneToMany时指定mappedBy属性——一旦为@OneToMany、@ManyToMany指定了该属性,则表明当前实体不能控制关联关系。当@OneToMany、@ManyToMany、@OneToOne所在的当前实体放弃控制关联关系之后,Hibernate就不会允许使用@JoinColumn或@JoinTable修饰代表关联实体的属性了。
(1)双向1-N中1的一端的代码示例
import java.util.HashSet; import java.util.Set; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity @Table(name="person_info") 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; @OneToMany(targetEntity=Address.class,mappedBy="person") 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; } }
(2)双向1-N中N的一端的代码示例
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.ManyToOne; import javax.persistence.Table; @Entity @Table(name="address_info") public class Address { @Id @Column(name="address_id") @GeneratedValue(strategy=GenerationType.IDENTITY) private Integer id; @Column(name="address_name") private String name; @ManyToOne(targetEntity=Person.class) @JoinColumn( name="p_id", referencedColumnName="p_id", nullable=false ) private Person person; 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 Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
(3)测试例子
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 p = new Person(); //设置Person的属性 p.setName("liujiang"); p.setAge(24); //持久化Person对象——插入主表记录 session.save(p); //创建一个瞬态的Address对象 Address a1 = new Address("A"); //设置Person和Address之间的关联关系 a1.setPerson(p); //持久化Address对象——插入从表记录 session.persist(a1); //再创建一个瞬态的Address对象 Address a2 = new Address("B"); //设置Person和Address之间的关联关系 a2.setPerson(p); //持久化Address对象——插入从表记录 session.persist(a2); tx.commit(); HibernateUtil.closeSession(); } }
2.有连接表的双向1-N关联
Hibernate的关联映射——双向1-N关联的更多相关文章
- 017 多对多关联映射 双向(many-to-many)
多对多关联映射 双向 两方都持有对象引用,修改对象模型,但数据的存储没有变化. 再修改映射文件: public class Role { private int id; private String ...
- (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...
- 【Hibernate框架】关联映射(多对多关联映射)
按着我们的总结行进计划,接下来,就是有关于多对多映射的总结了. 我们来举个例子啊,很长时间以来,房价暴涨不落,但是还有很多人拥有很多套房产,假如说,一个富豪拥有九套房产,家里人么准去住哪一套,我们就以 ...
- (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)
上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...
- Hibernate一对一双向关联映射
关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介 ...
- Hibernate从入门到精通(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射,这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映射所不同的的 ...
- Hibernate(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射, 这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映 射所不同 ...
- Hibernate一对多单向关联和双向关联映射方法及其优缺点 (待续)
一对多关联映射和多对一关联映射实现的基本原理都是一样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不同.它们的区别在于维护的关系不同: 一对多关联映射是指在加载一的一端数据的同 ...
- 【SSH进阶之路】Hibernate映射——一对一双向关联映射(六)
上篇博文[SSH进阶之路]Hibernate映射--一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指仅仅能从人(Person)这端载入身份证端(IdCard),可是反过来.不能从身份 ...
随机推荐
- cocos2d-x-3.1.1 创建项目
cocos new 项目名 -p 包名 -l 语言 -d 路径 cmd 输入以下命令 cocos new HelloLua -p com.wcc.hellolua -l lua -d E:\coc ...
- error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCR...
http://blog.csdn.net/playstudy/article/details/6661868 一,问题描述MSVCRTD.lib(crtexew.obj) : error LNK201 ...
- Vue 双向数据绑定原理分析 以及 Object.defineproperty语法
第三方精简版实现 https://github.com/luobotang/simply-vue Object.defineProperty 学习,打开控制台分别输入以下内容调试结果 userInfo ...
- 【转】java开源类库pinyin4j的使用
最近CMS系统为了增加查询的匹配率,需要增加拼音检索字段,在网上找到了pinyin4j的java开源类库,提供中文转汉语拼音(并且支持多音字), 呵呵,看了看他的demo,决定就用它了,因为我在实际使 ...
- IE6低版本jQuery里的show和hide方法BUG
公司内部一直在用的jQ的版本有些低,具体是哪个版本不太清楚,相关的东西都给删掉了,今天在做一个固定在页面右侧的导航的时候,IE6里出现了一个比较奇葩的问题.具体样子如下图: 收起是用定位left等于负 ...
- Unity3D 开发 之 加载Android应用的环境
(1)下载安装JDK:http://www.oracle.com/technetwork/java/javase/downloads/index.html (2)下载安装Android SDK:htt ...
- JavaMail接、收邮件
我总算把这个研究出来啦.... 不要觉得 代码有点多哈. 我们先来说发送邮箱吧,首先建立一个属性文件*.properties sys.properties server=smtp.163.com ## ...
- (转载)eclipse插件安装的四种方法
eclipse插件安装的四种方法 Eclipse插件的安装方法 1.在eclipse的主目录(ECLIPSE_HOME, 比如在我的机器上安装的目录是:D:\eclipse)有一个plugins的目录 ...
- Java反射与动态代理
Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制.java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的 ...
- MVC EF 执行SQL语句
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 闲着没事,看了一篇关于LINQ和SQL对比的文章,网友们 ...