Hibernate关系映射1(nto1)

合集下载

Hibernate实体关联关系映射----总结

Hibernate实体关联关系映射----总结

Hibernate实体关联关系映射----总结在我看来,Hibernate提供这些映射关系,常⽤就是⼀对⼀和多对⼀,并且在能不⽤连接表的时候尽量不要⽤连接表。

多对多会⽤到,如果⽤到了,应该⾸先考虑底层数据库设计是否合理。

在实际开发中,在Hibernate关联关系之外常常还有另外⼀种选择⽅案,表各⾃作为单表映射,业务逻辑控制外键关系(有时候就是⼀个相关联的列,但不⼀定要加外键约束),这样更加灵活,并且数据的完整性同样有保证。

当然,“单表映射,业务控制外键关系”并不是说Hibernate的实体关联功能是多余的,Hibernate的实体关联的优点很多,随便拿本书都是讲优点,⽤好了会让开发⼈员感觉更⽅便,现在我也是两种⽅案结合使⽤。

⽐如对于不很确定的两个实体,常常选⽤单表关联。

以前在初学Hibernate还没有完全搞清楚这些关联关系的时候,就是⽤单表映射,业务控制外键关系做的,发现没有任何问题,程序同样运⾏得很好。

看了这些是不是后悔浪费时间学习映射关系了?呵呵,Hibernate的OR Mapping是Hibernate的灵魂,我相信Hibernate的创始⼈⽐我们⼀般⼈的理解更深刻。

只有学会了这些才能体会Hibernate设计者的思想。

学⼀个东西,不光⾃⼰写代码,还应该能看懂别⼈的代码才⾏。

因此系统学习这些关联映射还是⼤有必要的。

以上都是我⾃⼰的观点。

欢迎在此交流讨论。

Hibernate在实际项⽬开发中,hbm.xml包括数据库脚本都是通过Xdoclet⽣成的,在此不采⽤Xdoclet的⽬的是为了便于理解这些映射模型。

实体-数据表-映射⽂件三者对⽐看,太直观了。

瞌睡了,暂时先写到此,有新思路了再补上。

-----------------------------------------------------回Hibernate:Hibernate关联关系映射⽬录│├─单向关联│├─│├─│├─│├─│├─│├─│├─│└─└─双向关联├─├─├─├─├─└─。

【注解】hibernate关系映射级别注解

【注解】hibernate关系映射级别注解

【注解】hibernate关系映射级别注解关系映射级别注解一对一单向外键@OneToOne(cascade=CascadeType.ALL)@JoinColumn(name="pid",unique=true)注意:保存时应该先保存外键对象,再保存主表对象。

在主控方的外键对象上进行配置,@JoinColumn中配置的是外键的对应信息。

主控方:被控方:测试方法:一对一双向外键主控方的配置同一对一单向外键关联@OneToOne(mappedBy="card") //被控方双向关联,被控方必须设置mappedBy属性。

因为双向关联只能交给一方去控制,不可能在双方都设置外键保存关联关系,否则双方都无法保存。

主控方:被控方:测试方法:加深理解:一对一单向外键联合主键创建主键类主键类必须实现serializable接口,重写hashCode()和equals()方法主键类@Embeddable实体类@EmbeddedId测试方法:多对一单向外键多方持有一方的引用,比如:多个学生对应一个班级(多对一)@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER)@JoinColumn(name="dept_id",referencedColumnName="uuid")@JoinColumn中配置的是一方的对应信息。

示例中相当于在UserTest的dept_id列上添加了外键约束 参考的是classroom的uuid列多方:一方:测试方法:一对多单向外键一方持有多方的集合,一个班级有多个学生(一对多)。

@OneToMany(cascade={CascadeType.ALL},fetch=ZY) @JoinColumn(name="cid")一方:多方:测试方法:总结:多对一时候,多方设置EAGER,一方设置LAZY。

Hibernate_关联关系(多对一和一对多)理论

Hibernate_关联关系(多对一和一对多)理论
5/29
关联关系
类与类之间最普遍的关系就是关联关系
单向的关联 双向的关联
6/29
多对一单向关联关系
配置从Emp到Dept的多对一单向关联
Dept持久化类 Emp持久化类
Dept.hbm.xml
Emp.hbm.xml
<clapsusbnlicamclea=s"scDn.ejbpitt.ihmibpelermnaetnetdseSmeor.ieanlitziatyb.lDEeme{ppt" table="edmeppt"">> <pidrivnaatme eB=y"tdeemedppetNpotN"oc;olumn="EDMEPTNNOO" "tytpypee=="j"ajavava.l.alanngg.I.nBteygtee"r>"> pr<igvaetneeSrattroinrgcldaespst=N"aamssei;gned"/> <p/irdiv>ate String location;
13/29
共性问题集中讲解
常见问题及解决办法 代码规范问题 调试技巧
共性问题集中讲解
14/29
学员操作——配置一对多双向关联
需求说明
配置区县到街道的双向的一对多 添加区县级联添加该区县下的两个街道 设置区县的inverse属性值为true,修改某区县, 从该区县中移走某一街道。 设置区县的<set>元素的order-by属性为:按照街 道编号倒叙排序
更新所有关联的游离状态的对象。
delete
当通过Session的delete()方法删除当前对象时,会 级联删除所有关联的对象。

J2EE项目实训Hibernate框架技术——第5章 对象关联关系的映射技术(第1部分)

J2EE项目实训Hibernate框架技术——第5章 对象关联关系的映射技术(第1部分)

第五章对象关联关系的映射技术(第1/4部分)读者通过对本书的前四章的学习,肯定能够对“Hibernate框架是JDBC的轻量级的对象封装”有所体验;同时也能够理解Hibernate框架是以面向对象的编程形式实现对数据库表中的数据CRUD操作,这种方式的改变能够给开发人员带来实质性的好处!但Hibernate框架的强大不仅仅体现在对JDBC的数据访问操作的“简化”方面,其O/R Mapping(对象/关系的映射)的功能才是Hibernate框架中的精华部分。

读者应该知道,从面向对象的角度来看对象之间的关系,主要有“关联、继承、聚合和组合”等形式;如果开发者在“域建模”中获得了各个业务实体对象,而且也按照面向对象的方式建立了各个业务实体对象之间的关联、继承或者聚合和组合等关系。

随后所带来的问题是,如何将在“域建模”中所获得的各个业务实体对象之间的关系也能够持久存储,也就是说开发者不仅需要将各个业务实体对象本身的属性进行存储,当然也希望能够将对象之间的关系也能够存储或者保存下来!因为业务实体对象之间的关系也反映了具体的商业规则!目前所应用的各种企业级的数据库管理系统还是关系型的数据库系统(虽然Oracle号称是面向对象的,但是使用SQL语句操作的时候依然是关系型的),在数据库表中以及数据库表之间是无法实现面向对象中所有的关系,特别是“继承和聚合、组合”关系!而如果不能存储对象之间的关系,那从数据库表中再读出这些数据后开发者又如何恢复和保证这些数据之间关系?等等这些问题是开发者比较棘手的问题,当然对这些问题的解决与否在企业级项目开发中是不应该回避的,那又如何解决这些问题!因此需要一个中间的“桥梁”或者“适配器”类的程序来协调“面向对象”和“面向关系”!而Hibernate框架的设计者则将Hibernate框架定位为一个“O/R Mapping的中间件”,并且在此技术领域为开发人员提供了一个比较满意的解决方法,也就是从本章开始将要连续介绍的Hibernate框架中的O/R Mapping技术。

框架学习之Hibernate 第六节 关系映射

框架学习之Hibernate 第六节  关系映射

框架学习之Hibernate 第六节关系映射学习各种映射关系时总结:①如何将对象之间的关联关系映射到数据库中②如何检索出关联对象 1.多对一映射它是用法最多的映射关系,性能上占有优势关系模型和对象模型:两者并不是一一对应的举个例子:告知员工属于哪个部门和告知部门有哪些员工对于数据库(关系模型)来说只要有一个就可以但是对于对象模型不是如此,告知员工属于哪个部门之后,部门并不会知道自己有哪些员工 2.一对多映射它的关系模型和上面一样,也就是表的结构并不转变,但是对象模型转变了 3.一对一映射主对象和从对象主对象假如没有从对象可以,但是从对象没有主对象是不可的查找主对象时只用了一条sql语句,用法了outer 查找从对象时用了两条语句,首先查从对象,然后查主对象(假如要用法从对象对应的主对象)两种映射办法:①基于主键的一对一②基于外键的一对一 4.多对多映射用法的不是无数,要注重数据量的大小对性能的影响,由于多对多需要查三张表 5. 组件映射当一个类的属性很特别,不是数据库中支持的类型,而且又算不上是一个实体,没有表与之对应时可以用法组件映射假如组件的属性不能和表中的字段容易对应的时候可以挑选用法自定义用户类型! 6.关系映射的总结①对于关联关系的查询,Hibernate普通都是用法两条sql语句将它查出来,但是一对一的状况里的查主对象例外,它是一条sql 7.集合映射xml – Java集合类型 - 特点 xml中需要配置的信息:- Set 没有重复,不保存加入的挨次array:- Class[] 有挨次的 list-indlist:- List 可以重复,有挨次的 list-indexbag:- List 不保存挨次的List list-indexmap:- Map map键值对的映射类型 map-key编写 xml 办法用法原则:多数状况下都是用法set,需要保证挨次用法list,但是想用List而又不需要保证挨次用法bag 注重点:①定义成 Set,而不是 HashSet②本来是 HashSet,保存了之后就不再是 HashSet 了,强制转型时会报错的!缘由是Hibernate举行的封装,变成了PersitentSet,实现了 Set 接口,但是和 HashSet 没有关系,不能第1页共2页。

hibernate关联映射详解

hibernate关联映射详解

hibernate关联映射详解一对多关系 1.一对多关系(单向):在一端映射文件中加入:name= student keyumn= classes / one-to-many > /set 2.一对多关系(双向):(1).在一端映射文件中加入: setname= student keycolumn= classesid / one-to-many > /set (2).在多的一端加入: many-to-onename= classes column=classesid /many-to-one 多对一关系在多的一端加入:many-to-one name= classes column= classesid / 一对一关系 1. 一对一外键关联单向:(它其实就是一个多对一映射的一个特例,只是设置ue=”ue”)在维护关系一端的映射文件中加入:many-to-onename= card unique= true cascade= all /many-to-one 双向:在维护关系一端的映射文件中加入: many-to-onename= card unique= true cascade= all /many-to-one 在另一段的映射文件中加入: one-to-onename= users property-ref= card /one-to-one 因为 one-to-one name 标签默认是找关联主键,所以在这里需要property-ref= card 配置关联属性。

Cascade属性是级联的意思。

2. 一对一主键关联 a) 单向在维持关系一端的代码: classname= er_pk idname= id generator > paramname= property card_pk /param /generator /id propertyname= name unique= true /property one-to-onename= card_pk constrain= true /one-to-one /class 设置generator > constrained= true 设置该实体的主键是card_p的外键。

Hibernate中one-to-one的深入学习

Hibernate中one-to-one的深入学习

Hibernate中one-to-one的深⼊学习1.关于one-to-one持久化对象之间⼀对⼀的关联关系是通过one-to-one元素定义:<one-to-onename="propertyName" (1)class="ClassName" (2)cascade="all|none|save-update|delete" (3)constrained="true|false" (4)outer-join="true|false|auto" (5)property-ref="propertyNameFromAssociatedClass" (6)access="field|property|ClassName" (7)/>(1)name: 属性的名字[POJO中的]。

(2)class (可选 - 默认是通过反射得到的属性类型):被关联的类的名字。

(3)cascade(级联) (可选) 表明操作是否从⽗对象级联到被关联的对象。

(4)constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过⼀个外键引⽤对主键进⾏约束。

这个选项影响save()和delete()在级联执⾏时的先后顺序(也在schema export tool中被使⽤)。

(5)outer-join(外连接) (可选 - 默认为⾃动): 当设置e_outer_join的时候,对这个关联允许外连接抓取。

(6)property-ref: (可选) 指定关联类的⼀个属性,这个属性将会和本外键相对应。

如果没有指定,会使⽤对⽅关联类的主键[POJO中POJO类的实例]。

(7)access (可选 - 默认是 property): Hibernate⽤来访问属性的策略。

hibernate对象关系映射文件节点说明

hibernate对象关系映射文件节点说明
N
outer-join
是否使用外连接
True:总是使用outer-join
False:不使用outer-join
Auto:如果关联对象没有采用proxy机制,则使用outer-join
N
fetch
Fetch=“join”等同于outer-join=“true”
Fetch=“select”等同于outer-join=“false”
数据库Schema名称
N
catalog
数据库catalog名称
N
default-cascade
默认级联模式默认是none
N
default-access
默认属性访问模式对于大多数情况采用property即可,这种方式将通过getter/setter方法对影射类属性进行存取,默认是property
N
default-lazy
dynamic-update="false|true"dynamic-insert="false|true"
select-before-update="false|true"polymorphism="implicit|explicit"
where="arbitrary sql where condition"persister="persisterClass"
节点内容:
<classname="ers"
table="users"discriminator-value="1"mutable="true|false"
schema="dbo"catalog="shopping"proxy="ProxyInterface"
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

类之间的一对多关联
一对多映射配置
<set name="products"> <key column="catagory_id"></key> <one-to-many class="com.ambow.pojo.Product" /> </set>
cascade级联
一对多双向关联
一对多双向关联—类
Hibernate 的关联映射
多对一(一对多)
目标: 多对一单向关联 一对多单向关联 级联(cascade) 一对多双向关联 控制反转(Inverse)
多对一的单向关联
表与表之间的关联可以分为一对一、一对 多、多对一和多对多 例如:在一个大的商品分类下有多个小的 分类,一个小的分类下有多个商品
类之间的多对一关联
类之间的多对一关联
多对一映射配置
在多的一方添加映射配置信息,表达多对 一的关系 <many-to-one name="category" class="com.ambow.pojo.Category" > <column name="category_id" /> </many-to-one>
一对多双向关联—映射配置
在Product映射文件中配置
在Category映射文件中配置
控制反转
inverse=&#果category作为主动方则先进行分类的插
入,再对商品进行插入,插入商品时分类 的ID为null,然后再在商品中进行categoryid的修改。 设置了控制反转提高性能,没有update语 句。
相关文档
最新文档