随笔-7  评论-24  文章-102  trackbacks-0

1、使用 Hibernate 操作数据库

1-1、使用 ThreadLocal 控制 Session

    应用程序根据配置文件构建应用程序运行的环境,建立全局范围内的 SessionFactory 对象。其内部包含了 Hibernate 运行的全部细节,是产生 Session 的工厂,它是线程安全的,只能在系统启动时实例化一次,系统运行期间不可修改。

    Session 对象是 Hibernate 操作数据的核心,数据库的操作、对象生命周期的管理、应用事务的划分,都需要在 Session 对象中完成。Session  对象不是线程安全的,如果试图让多个线程同时使用一个 Session 对象,将会产生数据混乱,造成数据库的数据不一致。而且频繁开关 Session 是巨大的系统消耗。

    为了安全地使用 Session 对象,需要应用 Java 语言中的线程绑定机制--ThreadLocal,它代表一个线程的私有存取空间,能够隔离多线程环境中的并发机制,减少 Session 对象的创建和销毁次数,降低系统资源浪费。

HibernateSessionFactory


1-2、建立数据库结构

    使用 Hibernate 时,设计生成数据库表结构的方式分成两种。

1、手工用 SQL 语句设计数据表结构

2、使用 Hibernate 根据映射文件自动构建数据库模式
    hibernate.cfg.xml:
 <property name="hbm2dll.auto">creat</property>
 <property name="show_sql">true</property>
    log4j.properties
 log4j.logger.org.hibernate.tool.hbm2dll=debug

Hibernate 自行管理的数据库表结构:
● none:不产生任何动作。
● create:在应用启动时,自动生成数据库表结构并导入到数据库中。
● create-drop:同 create,但在应用关闭时,删除已生成的数据库表结构;此方式常在测试时使用。
● update:在应用启动时,检查持久化类和映射文件的改变,更新数据库表结构,比如:持久化类添加一个属性后,Hibernate 能自动添加对应字段到对应的数据库表中。



3、使用 Session 操作数据库
  Hibernate 能自动管理系统中的持久化类和数据库模式,通过 Session 对象实现对象模型和关系模型的相互操作。
Session 提供数据访问的接口:
● get():从数据库获取数据对象,不存在时则返回 null。
● load():从数据库获取数据对象,不存在时则抛出异常。
● createQuery():根据条件查询数据对象。
● save()、update()、delete() 等方法。

 




2、Hibernate 基本组件接口

● Configuration(org.hibernate.cfg.Configuration)
  Hibernate 应用的入口,它使用配置文件初始化运行环境,是 SessionFactory 的工厂。通常情况下,一个应用程序中只允许创建一个单例的 Configuration 实例。

● SessionFactory(org.hibernate.SessionFactory)
  是一个线程安全的高速缓存,其中包含了单一数据库和已编译映射文件的元数据,在运行环境不可改变。它是 Session 的工厂,并能从 ConnectionProvider 中获取 JDBC 连接。它可能持有一个可选的能在进程级别或者集群级别事务间重用的数据缓存(二级缓存)。SessionFactory 从 Configuration 中获取,在一个应用范围中,不允许改变。

● Session(org.hibernate.Session)
  单线程的短生命周期的对象,是应用程序和持久化存储的一次对话。封装了一个 JDBC 连接,也是 Transaction 的工厂。它保持一个持久化对象的强制缓存(一级缓存),用来遍历对象图或者根据标识符查询对象。Session 提供了一系列方法,可以方便地实现对象持久化操作。

● Transcation(org.hibernate.Transcation)
  可选,单线程、短生命周期的对象,应用程序用它来表示一批任务的原子操作。是底层 JDBC,JTA 或者 CORBA 事务的抽象。一个 Session 在某些情况下可能跨越多个 Transcation 事务。

● ConnectionProvider(org.hibernate.connection.ConnectionProvider)
  可选,JDBC 连接的工厂和连接池,是底层 Datasource 或 DriverManager 的抽象应用,对应用程序不可见。可扩展实现。

● TranscationFactory(org.hibernate.TranscationFactory)
  可选,事务实例工厂。对应用程序不可见。可扩展实现。


  在最小集合应用框架中,应用程序直接使用 JDBC/JTA,并自行完成事务处理。
 conn = DriverManager.getConnection(xxx);
 conn.setAutoCommit(false);
 ...
 conn.commit();




3、Hibernate 生命周期

① Configuration 对象根据配置文件的设置,读取属性配置信息。
② Configuration 对象根据配置信息,按照映射文件、类缓存、集合缓存、监听器、事件的顺序依次读取并解析。
③ 通过调用 Configuration 对象构建 SessionFactory。
④ 调用 SessionFactory 实例获得 Session 对象。
⑤ 启动事务。
⑥ 提交事务。
⑦ 关闭应用(Session 和 SessionFactory)。



4、Hibernate 中对象的状态

  为了区分持久化类的实例对象,根据对象和会话的关联状态,可以分为三种情况:

 

● 暂态状态。对象刚建立,还没有使用 Hibernate 进行保存。该对象在数据库中没有记录,也不在 session 缓存中。如果该对象是自动生成主键,则该对象的对象标识符为空。

● 持久化对象。对象已经通过 Hibernate 进行了持久化,数据库中已经存在对应的记录。如果该对象是自动生成主键,则该对象的对象标识符已被赋值。

● 托管对象。该对象是经过 Hibernate 保存过或者从数据库中取出的,但是与之关联的 session 已经被关闭。虽然它拥有对象标识符,且数据库中存在对应的记录,但是已经不再被 Hibernate 管理。


ps. [转] PO BO VO DTO POJO DAO概念及其作用(附转换图)




5、对象标识符
 
  关系数据库表的主键在 Java 应用环境中的体现。

5-1、关系型数据库的主键生成机制
  序列生成主键,整数
  自动增长组件,整数
  全局统一标识符 GUID(Globally Unique Identifier),字符串主键

 
5-2、Java 环境中的对象识别机制
  引用比较,比地址 “==”
  内容比较,比数据 equals() 方法


5-3、Hibernate 对象识别符的作用
  在生成 Java 对象时,给标识属性分配一个唯一的值,用于区分同一个类的多个不同的实例。体现在 Hibernate 中就是对象标识符。


5-4、Hibernate 内置标识符生成器的使用方法
  org.hibernate.id.IdentifierGenerator 接口。

ps.  映射对象标识符

5-5、使用复合主键时组合标识符的使用方法(常用于遗留的系统中)
  嵌入式组合标识符/映射式组合标识符,映射多个主键字段和持久化类的多个属性。




6、配置 Hibernate

6-1、配置方式
  可编程还是文件配置方式

Hibernate JDBC 配置属性
  hibernate.jdbc.fatch_size:指定 JDBC 抓取数据的数量大小,非零值
  hibernate.jdbc.batach_size:允许 Hibernate 使用 JDBC2 的批量更新,非零值,建议 5 到 30
  hibernate.jdbc.provider_class:自定义的 ConnectionProvider 类名,用于向 Hibernate 提供 JDBC 连接
  hibernate.jdbc.autocommit:确认是否开启 JDBC 自动提交功能,默认为 false 不自动提交


6-2、方言
  屏蔽底层数据库系统的方言机制,方便与数据库间迁移。
  MySQL:org.hibernate.dialect.MySQLDialect
  MySQL with InnoDB:org.hibernate.dialect.MySQLInnoDBDialect
  MySQL with MyISAM:org.hibernate.dialect.MySQLMyISAMDialect


6-3、Hibernate 日志系统
  使用 Log4J 作为  Hibernate 的日志系统,需要将 Log4J 的库文件 log4j.jar 放置到类路径下(其发布包以包含 Log4J 的库文件)。然后编写日志配置文件 log4j.properties 并放到 classpath 路径中。

  Log4J 中,几个日志输出级别的顺序是:只输出高于或等于 设定级别 的记录。
trace < debug < info < warn < error < fatal

  在开发模式中,可以选择 DEBUG 级别的输出;应用部署后,可以配置为 ERROR。 

log4j.properties




7、Hibernate 映射类型


7-1、时间日期映射类型(内置映射类型)

  Java 语言提供了 java.util.Date 和 java.util.Calendar 两个类实现时间的运算。此外,JDBC 还提供了 java.util.Date 的三个扩展类 java.sql.Timestamp、java.sql.Time 和 java.sql.Date 分别对应标准 SQL 数据类型中的 TIMESPAME/DATETIME(时间日期)、TIME(时间)、DATE(日期)。

java.util.Date/java.sql.Date                                  H:date                             SQL:DATE
java.util.Time/java.sql.Time                                H:time                             SQL:TIME
java.util.Date/java.sql.Timestamp                        H:timestamp                    SQL:TIMESTAMP/DATETIME
java.util.Calendar                                               H:calendar                       SQL:TIMESTAMP/DATETIME
java.util.Calendar                                               H:calendar_date               SQL:DATE


7-2、自定义映射类型


 

posted on 2009-04-11 10:45 黄小二 阅读(480) 评论(0)  编辑  收藏 所属分类: S/S2SHJ2EEJ2SE

只有注册用户登录后才能发表评论。


网站导航: