首页 > 代码库 > 黑马程序员——Hibernate 相关概念

黑马程序员——Hibernate 相关概念

  

 

 

1、HIbernate支持多种数据库,是一种“跨数据库平台”的ORM框架。使用Hibernate时需要先创建一个Session对话,然后开启Transaction事务、进行数据库读写、提交事务、关闭会话。Hibernate事务也支持回滚。 
2、实体类有3种状态,分别是临时状态、持久化状态、分离状态。 
临时状态(Transient):对象在保存进数据库之前为临时状态。这时候数据库中没有该对象的信息,该对象的Id属性也为空。如果没有被持久化,程序退出时临时状态的对象信息将会丢失。 
持久化状态(Persistent):对象在保存进数据库后或者从数据库中加载后、并且没有脱离Session时为持久化状态。这时数据库中有该对象的信息,该对象的Id为数据库中对应疾苦的主键值。由于还在Session中,持久化状态的对象可以执行任何有关数据库的操作,例如获取集合属性的值等。 
分离状态(Detached):分离状态是对象曾经处于持久化状态、但是现在已经离开Session了。虽然分离状态的对象有Id值,有对应的数据库记录,但是已经无法执行有关数据库的操作。例如,读取延迟加载的集合属性,可能会抛出LazyInitializeException。
 
关键词:Session  数据库记录 
临时状态(Transient):数据库中没有记录、没有在Session中。 
持久化状态(Persistent):数据库中有记录、在Session中。 
分离状态(Detached):数据库中有记录、没在Session中。 
3、Hibernate中有几个常用的概念 SessionFactory、Session、Transaction。注意这里的Session不同于Servlet中的HttpSession,二者虽然都可理解为回话,但使用的情况不一样。 
SessionFactory(org.hibernate.SessionFactory):一个线程安全的Session工厂类,能为不同的线程生成不同的Session。SessionFactory维护者Session相关的资源,包括数据库连接池、缓存数据等。 
Session(org.hibernate.Session):Session代表用户的一次操作。Session的生命周期很短,在操作开始时通过执行SessionFactory.openSession()生产,在操作结束时通过执行session.close()关闭。Session维护着Session相关的资源。包括Transaction、当前数据连接等。 
Transaction(org.hibernate.Transaction):Transaction代表一次事务,事务内包括若干的数据修改,事务提交后才生效。如果事务失败或回滚,所有的修改都会失效。Hibernate的事务不同于数据库的事务。Hibernate可能使用各种机制保证事务性,包括JTA(Java Transaction API,Java事务接口)、第三方事务管理、数据库事务等。 
一个SessionFactory维护一个数据库。如果有多个数据库,可以创建多个SessionFactory。Hibernate允许程序使用多个SessionFactory同时操作多个数据库。 
4、配置实体类和数据库表单之间的映射关系的2种方式: 
(1)、XML文件配置。XML配置文件时最基础的配置。一般与实体类在同一个包中,命名风格 为 *hbm.xml  即hibernate mapping。 
(2)、@注解配置。是Java官方的JPA(Java Persistence API)提供的。 
特殊情况注意:@注解配置时,如果某属性没有配置,则默认该属性名与数据库表单列名相同;而XML文件配置时,如果如果某属性没有配置,则默认该属性没有对应的数据库表单列,不参与持久化。二者时接人不同的。 
5、主键增长策略 ,数据库自增长与Hibernate自增长产生区别的特殊情况。但是如果某数据库同时被两个Hibernate程序使用,那么此时使用Hibernate自增长将会出现错误。例如,如果当前主键值为10,那么Hibernate会认为下个主键值为11,两个Hibernate程序插入数据时都会讲主键值设为11,这时会因为主键冲突而导致其中一个写数据失败。 
6、数据库普通键的属性 
(1)Integer类型与int类型的不同之处:Integer默认为null,在数据库中冶表现为null,而int默认为0,在数据库中冶表现为0。 
(2)普通属性使用@Column与@Basic配置。二者都可以省略。如果省略,则全部按照默认的尔规则配置。 
@Column中可指定 
@nullable  是否允许为null 
@unique 是否唯一 
@insertable 是否允许插入 
@updatable 是否允许更新 
@length  列长度 
@columnDefinition 列类型 
@scale  整数长度 
@precision  小数点精度 
这些属性用于生成DDL建表语句。如果属性对应列名与属性名一致,@Column可以省略。 
@Temporal。日期属性如果是java.util.Date类型的,必须要用@Temporal配置日期类型,取值可以为Date、Time、Timestemp。java.sql.Date(只有年月日)、java.sql.Time(只有时分秒)、java.sql.TimeStamp(同时又年月日、时分秒),都是java.util.Date的子类。 
@Transaction  ,临时属性,不在数据库表单中生成对应列。 
@Version。使用版本的方式实现配置乐观锁。 
@Basic可为普通属性配置加载方式,默认为即时加载。如果列数据比较大,例如大文本类型或者LOB类型,可配置为延迟加载。optional配置该列是否可为null。如果为true,表示该属性石可选的,可以为null,否则不可以为null。 
7、JPA 对实体类的要求 
    由于Java注解需要配置到实体类中,因此JPA要求实体类必须为POJO(简单Java对象),而不能为String等基本类型。

 

 

 

黑马程序员——Hibernate 相关概念