`
Java_大猫
  • 浏览: 170765 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

hibernate学习总结一

阅读更多
最近在原有的基础上又一次的学习了下hibernate。师父说过,学习要记得写笔记。所以今天来做一次关于hibernate的笔记:
希望对初学者有所帮助,大家相互学习,相互进步。

1.SessionFactory
是针对单个数据操作编译后的内存镜像,他是一个线程安全的,不可变的。

2.session
  作为应用程序与持久层操作的一个单线程对象。所有的操作对已hibernate来说都必须同session对象去进行操作。

3.hibernate三种状态
  transient 瞬时状态:实体对象自由状态,既没有和数据库有任何联系时。
  persistent 持久状态:此时实体对象被纳入hibernate管理。
  detached  脱离状态:由persistent转变成detached状态,此时session关闭后。与上下午无任何联系。

4 hibernate映射关联
 
多对一(many to one)
   用户--用户组
 <many-to-one name="group" column="groupid" cascade="all"></many-to-one>

  会在多的一段加入一个外键,这个外键有column设定。 如果忽略这个属性 外键与实体属性一致
级联是:是对象的连锁操作

一对一(one to one)
分两种状态,单项与双向主键外键。首先我们先来看单项:
  一对一主键关联映射(单向关联Person---->IdCard)
  让两个实体对象的id保持相同,这样可以避免多余的字段被创建
  这里要关注的是如果是one2one 单项我们的主键生成策略需要发生变化:
 
<id name="id">
			<generator class="foreign">
				<param name="property">idCard</param>
			</generator>
	</id>
<one-to-one name="idCard" constrained="true"/>


此时主键上存在一个约束,默认person的主键作为外键参照了idCard 我们可以通过建立表后看到 在person表中加了一个index 外键是card表的id。

一对一主键关联映射(双向关联Person<---->IdCard)
在IdCard的一段加入一个 <one-to-one>标签指向person,
 <one-to-one name="person" ></one-to-one>


hibernate一对一唯一外键关联映射(单向关联Person---->IdCard)

一对唯一外键关联映射是多对一关联映射的特例

可以采用<many-to-one>标签,指定多的一端的unique=true,这样就限制了多的一端的多重性为一
通过这种手段映射一对一唯一外键关联
<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
	<many-to-one name="idCard" unique="true"></many-to-one>


而在一的一方需要通过一个
<one-to-one name="person" property-ref="idCard" ></one-to-one>

而需要设置 的是 property-ref 的引用 去指定到跟哪个字段关联。



hihernate一对多关联映射(单向Classes----->Student)

一对多单项中 我们需要在一的一段去为多的一段映射一个 一端的外键。
而在一的一段通过set 集合去映射即可。
  <set name="students">
  	<key column="classesid" not-null="true"/>
  	<one-to-many class="com.viken.Hibernate.Student"/>
  </set>


当通过单项的时候,一旦一的一方 外键含有NULL 则无法进行更新,也就是在每一次 都需要发出一个update语句进行更新,一旦有NULL 就无法更新,所以我们需要通过双向方式进行 ONE2MANY的映射。

 
<set name="students" inverse="true" cascade="all">
  	<key column="classesid"/>
  	<one-to-many class="com.viken.Hibernate.Student"/>
  </set>

	<many-to-one name="classes" column="classesid"/>


再次我们需要 住的是一个inverse 属性进行反转使得 一的一方失效。通过多的一方维持关系








一对多关联映射利用了多对一关联映射原理

多对一关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是多指向一
一对多关联映射:在多的一端加入一个外键指向一的一端,它维护的关系是一指向多

也就是说一对多和多对一的映射策略是一样的,只是站的角度不同

在一一端维护关系的缺点:
* 如果将t_student表里的classesid字段设置为非空,则无法保存
* 因为不是在student这一端维护关系,所以student不知道是哪个班的,
  所以需要发出多余的update语句来更新关系

hihernate一对多关联映射(双向Classes<----->Student)

一对多双向关联映射:
* 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端
* 在多一端采用<many-to-one>

注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段的错误

如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多
的一端来维护关联关系

关于inverse属性:
inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
默认inverse为false,所以我们可以从”一“一端和”多“一端维护关联关系,
如果设置成inverse为true,则我们只能从多一端来维护关联关系

注意:inverse属性,只影响数据的存储,也就是持久化

inverse和cascade
* inverse是关联关系的控制方向
* cascade操作上的连锁反应
  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics