Hibernate学习笔记1

1.概念

Hiberbate是轻量级Java EE应用的持久层解决方案,不仅管理Java类到数据库表的映射(包含Java数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,可以大幅度缩短处理数据持久化的时间。

2.ORM:对象/关系数据库映射

2.1.面向对象的优势

a.面向对象的建模、操作

b.多态、继承

c.摒弃难以理解的过程

d.简单易用,易理解

2.2.关系数据库优势

a.大量数据查找排序

b.集合数据连接操作、映射

c.数据库访问的并发、事务

d.数据库的约束、隔离

2.3.ORM作用
当采用面向对象语言进行应用开发时,而访问底层依然使用关系数据库时,如果重返关系数据库的访问方式时,会显得十分麻烦,因此引入一个中间工具ORM,采用ORM框架之后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象。因此,ORM框架是负责将持久化对象的保存、删除、修改等操作,转换成对数据库的操作。
2.4.基本映射关系

a.数据表映射类

b.数据表的行映射对象(即实例)

c.数据表的列映射对象的属性

3.Hibernate优势

3.1.与其它ORM框架对比的优势

a.开源和免费的License,方便需要时研究源代码,改写源代码,进行功能定制

b.轻量级封装,避免引入过多复杂的问题,调试容易,减轻程序员负担

c.有可扩展性,API开放。功能不够用的时候,自己编码进行扩展

d.开发者活跃,产品有稳定的发展保障

3.2.Hibernate操作数据库与JDBC操作数据库的优势

1)不需要编写SQL语句,而是允许采用OO方式来访问数据库

2)在JDBC访问过程中大量的checked异常被包装成Hibernate的Runtime异常,从而不再要求程序必须处理异常。

4.Hibernate进行持久化操作步骤

1)开发持久类,由POJO+持久化注解组成

2)获取Configuration

3)获取SessionFactory

4)获取Session,打开事务

5)用OO方式操作数据库

6)关闭事务,关闭Session

5.Hibernate框架下持久化遵循的规则

1)提供一个无参数的构造器:只要提供了无参数的构造器,Hibernate就可以使用Constructor.newInstance()来创建持久化类的实例。为了方便Hibernate在运行时生成代理,构造器的访问控制符至少是包可见的,即大于或等于默认的访问控制符

2)提供一个标识属性:标识属性通常映射数据库表的主键字段。属性可以是任何名字,类型可以是基本类型但通常建议使用基本类型的包装类型作为标识属性的类型。

3)为持久化类的每个成员变量提供setter和getter方法。

4)使用非final的类:在运行时生成代理是Hibernate的一个重要功能,若使用final类,则无法生成代理。

5)重写equals()和hashCode()方法

6.对持久化实体操作以及相对应的数据库操作

1)持久化实体

通过Session提供的save(Object obj)、persist(Object obj)、save(Object obj,Object pk)、persist(Objectobj,Object pk)方法将new创建的瞬态对象转化为持久化对象,相当于数据库中的insert语句。

2)更新持久化实体

若要更新持久化实体,则需要先加载持久化实体,可以根据主键加载持久化实体:News n=sess.load(News.class,pk);加载实体相当于select语句;n.setTitle(“新标题”);sess.flush();在flush之前生成一条update语句。

3)更新脱管实体

对于持久化对象,一旦关闭session,那么该对象处于脱管状态。如果对脱管对象作出修改之后,可以使用新的session来保存修改,该脱管对象再次回到session管理之下,重新变成持久化状态。News n=firstSess.load(News.class,pk);firstSess.close();n.setTitle("...");SessionsecondSess=sf.openSession();secondSess.update(n);

update():保存脱管更新

updateOrSave():自动判断该对象是否曾经持久化过

merge():并不将该对象转化为持久化状态,而是返回一个持久化状态的副本

4)删除持久化实体

News n=Sess.load(News.class,pk);相当于select语句

Sess.delete(n);相当于delete语句

7.Hibernate关联映射

1)单向关联(A访问B,只需在A中添加B属性即可)

a.N-1:比如N个人对应一个地址,若使用无连接表:用@ManyToOne修饰,@JoinColumn()修饰映射外键列,@Cascade(CascadeType.ALL)设置级联操作,若主表记录还未被保存,系统先自动级联操作主表记录,再操作从表记录。若使用有连接表的关联:@JoinTable()进行修饰,关联主键列不唯一,当前主键列唯一。

b.1-1:一个人只能有一个身份证号,@OneToOne修饰

c.1-N:@OneToMany来修饰,在1的一端来控制关系,因为一对多,所以在1的一端引入Set集合属性,即将1对应的不同N打包进入set集合中

d.N-N:必须使用连接表,与1-N的区别就是关联实体主键列也不唯一。用@ManyToMany和@JoinTable()修饰

2)双向关联

双向关联则是需要注释两个两个实体类,相当于两个单向关联关系叠加。

8.继承映射策略

1)整个类层次对应一个表的映射策略

这种策略下需要添加一列作为辨别者列,用于区分每行记录到底是哪个类的实例。使用@DiscriminatorColumn(name=””,discriminatorType=...)修饰整棵继承树的根父类。并用@DiscriminatorValue(value)来修饰每个子类,value类型由discriminatorType决定,值是辨别者列的值。

该种策略的劣势:增加的属性映射的字段不能有非空约束。

优势:所有属性都在一个表内,无须进行多表查询,这种策略方式的性能是最好的

2)连接子类的映射策略

该种策略无须使用辨别者列,只需在继承树的根实体类上使用@Inheritance(Strategy=InheritanceType.JOINED)修饰。父类保存在父类表中,子类实体则由父类表和子类表共同保存。

该种策略劣势:对于类继承层次较深的继承树来说,查询子类实体时需要在多个子类表之间进行连接操作,导致性能低下。

优势:无须使用辨别者列,子类增加的属性可以有非空约束,一种理想的映射策略

3)每个具体类对应一个表

用@Inheritance(Strategy=InheritanceType.TABLE_PER_CLASS)修饰。父类实例数据保存在父类表中,子类实例数据保存在子类表中。

缺点:该种映射策略看不出子类和父类之间的联系,除了子类表会包含父类表的所有数据列之外,如果没有删除数据,整棵继承树的所有实例的主键加起来是连续的。

优点:底层数据库的数据看起来更符合正常情况下的数据库设计,不同实体的数据保存在不同的数据表中,更易理解。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值