首页 > 学院 > 开发设计 > 正文

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

2019-11-14 21:19:33
字体:
来源:转载
供稿:网友
黑马程序员——Hibernate 相关概念 Posted on 2014-10-13 21:26 诚心诚意 阅读(...) 评论(...) 编辑 收藏

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------

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等基本类型。


上一篇:java 注解

下一篇:Leetcode: Clone Graph

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表