Hibernate基础

 ORM--Object Relation Mapping

 

对象持久化,把数据保存在永久的存储介质(数据库)中

 

POJO类,就是标准的Java Bean。

 

Configuration是用于解析hibernate.cfg.xml文件和XXXXX.hbm.xml文件,并产生SessionFactory对象。

 

SessionFactory是和一个数据库一一对应的,他只能对应一个hibernate.cfg.xml文件,一个hibernate.cfg.xml中只能配置一个数据库的连接信息。对应关系:一个数据库----一个hibernate.cfg.xml---一个SessionFactory,SessoinFactory保存着和数据库连接的相关信息和映射信息。

 

 

Configuration,用于解析hibernate.cfg.xml文件和XXXXX.hbm.xml文件,并创建SessionFactory对象。

SessionFactory,用于创建Session对象。

Session,持久化管理器,对象级数据库操作

Query,对对象作持久化操作或查询操作

Transaction ,用于管理操作事务。

 

通常实体类和映射文件放在同一个包下。

 

<class name="Xxxxxx" table="Xxxxx"><!--将类和数据库的表联系起来-->

  <id name="studentId" column="studentId"><!--主键生成策略-->

   <generator class="assigned"/>

   <!--指定主键生成策略为用户指定-->

  </id>

  <property name="XXX" column="XXXX" type="string"/>

  <!--类中的属性和字段之间建立联系-->

  <property name="homeAddress" column="homeAddress"/>

  <property name="schoolAddress" column="schoolAddress"/>

  <property name="brithday" column="brithday" type="data"/>

                <!--在hibernate中其他类型可以自动识别只有Data类型必须指名-->

     </class>   

 

 

 

 

持久化对象,即就是在数据库中存有其相对应数据的对象,并且在内存中也有这个对象,这个对象在Session的管理范围内,也就是调用过save()方法同步到数据库的对象。

 

临时对象,即在内存中刚刚创建的对象,还没有同步到数据库,或者是数据库中信息被删除了的对象也是临时状态。

 

游离对象,也就是在数据库中有和该对象向对应的纪录,并且在内存中的也存在该对象,但是不在Session的管理范围之内,也就是在Session关闭之后,就成了游离对象,就不会在将其改变同步到数据库中,如果要使还想令其成为持久化对象就要在把它纳入Session管理中,也就是掉用Session中的update()方法就可以了。

针对这个对象的属性进行持久化操作,也就是通过级联进行设置。

 

外键都是存在于多方。

 

inverse=true的含义: 由双向关联另一方维护该关联(增删改查),己方不维护该关联(只能进行查询操作)。

 

查询对象,可以使用get()和load()方法,不过前提是必须知道该对象持久化时的唯一标识,也就是id,和这个对象的类对象。

 

 

 

 

 

以下是一对多中一端set标签的设置

<set name="st" inverse="true" cascade="delete" batch-size="3">

   <key column="cid"/>

   <one-to-many class="Student"/>

</set>

inverse="true"就是在设置如果在内存中的修改或添加了这个集合中的某一个或某几个对象他不会将全部集合的信息同步到数据库,而是只将集合中被修改的对象重新同步到数据库。

 

cascade属性是设置级联操作的,也就是在操作一端的数据如果影响到多端数据时会进行级联操作,

cascade="none",cascade="save-update",cascade="delete",cascade="all" cascade="persist"

cascade="delete-orphan",cascade属性的值常用的设置为以上五项:

 

none就是不使用级联操作,默认级联是none。

 

save-update也就是只有对象保存操作(持久化操作)或者是持久化对象的更新操作,才会级联操作关联对象(子对象)。

 

persist就只是将级联对象也持久化到数据库。

 

delete对持久化对象的删除操作时会进行级联操作关联对象(子对象)。

 

all对持久化对象的所有操作都会级联操作关联对象(子对象)。

 

all-delete-orphan,在多端进行删除操作时,会再多端表中留下null空纪录,设置了级联操作为delete之会将表中表示关联的外键id置成null,不会将这条纪录也删除掉,
     而把级联设置成delete-orphan就不会留有空纪录,而是级联的把相关纪录删除掉。

 

batch-size这个属性只能够写在set标签中,这个属性带表批量加载,也就是在加载一端的集合属性时会一次加载指定的数量的对象,而不是默认的一个一个的加载,会提高效率,
   批量加载只能用于延迟加载和立即加载策略,也就是(lazy="true"或者lazy="false")。

 

lazy="true" 延迟加载,所谓的延迟加载,就是对一端的集合属性的加载策略,就是在不使用到集合中的对象的数据就不会真正的加载集合中的对象数据,而是家在一个代理对象就相当于的一个空的容器。这也就是会出现LazyInitializationException异常,也就是没有初始化这个代理的集合对象,在事先查询到了集合中的对象就会初始化这个对象,如果Session没有关闭就会在查询加载集合中的对象信息,如果提前关闭了Session,当使用集合中的对象信息时就会有这个异常。

 

fetch="join",这就是使用了预先抓取策略,也就是针对关联的对象的加载策略,在使用到关联对象的信息时会再发送sql语句,如果不使用fetch="join",就会不使用表连接而是先
  查出一端的关联id再一条一条的发送sql语句查询到关联对象信息,使用了fetch="join"就会使用表连接将关联对象信息直接查寻出来的。fetch="lazy"这个是默认的设置。

 

注意:

在使用fetch="join"要区分开他和外连接的区别,他不会忽略配置文件中的加载策略,而使用了外连接就会忽略配置文件中使用了外连接的一端的所有加载策略,而替之为立即加载。

 

例:班级 tream,身份证 Certigicate 学生 student

身份证和学生是一对一关系,班级和学生是一对多的关系。学生对身份证的加载策略是预先抓取,学生对班级是预先抓取,但是班级对学生是延迟加载。

 

 

save,update,saveOrUpdate,load,get,list,iterate,lock这些方法都会将对象放在一级缓存中,一级缓存不能控制缓存的数量,所以要注意大批量操作数据时可能造成内存溢出;可以用evict,clear方法清除缓存中的内容。

 

二级缓存,SessionFactory级共享。

 

在一个JAVA类型和多个数据库数据类型相对应时并且你想要的和hibernate缺省映射不一致时,需要在映射文件中指明类型(:java.util.Date,数据库DATE,TIME,DATATIME,TIMESTAMPhibernate缺省会把java.util.Date映射成DATATIME型,而如果你想映射成TIME,则你必须在映射文件中指定类型)

悲观锁是由数据库本身所实现的,会对数据库中的数据进行锁定,也就是锁行。

乐观锁,也就是通过对记录加上某些信息来解决并发访问的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值