加载中…
个人资料
西域郎
西域郎
  • 博客等级:
  • 博客积分:0
  • 博客访问:40,984
  • 关注人气:17
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

传智播客课程——Hibernate 入门

(2009-04-10 19:29:21)
标签:

传智播客

it

hibernate

javajar

name

update

主键

log4j

分类: 我的Java学习

    Java是面向对象语言,对象模型,其主要概念有:继承、关联、多态等;关系型数据库中的概念有:表、主键、外键等。当使用 Jdbc 去操作关系型数据库时,因为他们对应不起来,所以要做转换(转换的过程就叫做 ORM, Object Relation Mapping, 对象关系映射)。除了手工转换外,还可以使用 ORM 框架来解决,当前主流 ORM 框架有 Hibernate 和 TopLink 等。
    今天,在传智播客的课堂上,汤阳光老师为我们讲述了 Hibernate 框架,使我们对 Hibernate 框架有了一个初步的认识,并掌握了 Hibernate 配置和一些主要的操作数据库的对象。
    映射文件(hbm.xml): 是配置对象与数据库表的对应关系。是站在对象的位置上进行配置的。* hibernate-mapping 元素, package:指定一个包前缀,如果在映射文档中没有指定全限定的类名,就使用这个作为包名。auto-import:指定是否可以在查询语言中使用非全限定名(仅限于本映射文件中的类),默认为true。

    Hibernate 映射文件就是用于说明 Java 对象与数据库表中的记录的对应关系的。不能性质的属性(例如主键和普通属性)用不同的标签来映射,如果 Java 对象中的某个属性不需要存储到数据库中,那么就不需要在映射文件中配置这个属性。


1. 准备环境:
  <1> 引入 jar 包,最基本的包为:
      hibernate3.jar
      antlr-2.7.6.jar
      asm.jar
      asm-attrs.jar
      cglib-2.1.3.jar
      dom4j-1.6.1.jar
      commons-collections-2.1.1.jar
      commons-logging-1.0.4.jar
      jta.jar
      所用的数据库的 JDBC 驱动
      可以选择加入 log4j-1.2.11.jar。

   <2> 拷贝配置文件 hibernate.cfg.xml 到 classpath 的根中,并修改其中的数据库连接信息。选择拷贝 log4j.properties 文件。
 <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
 <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
 <property name="hibernate.connection.url">jdbc:mysql:///lesson-hibernate</property>
 <property name="hibernate.connection.username">root</property>
 <property name="hibernate.connection.password">itcast</property>
 <!-- 显示 sql 语句 -->
 <property name="show_sql">true</property>
 <!-- 自动更新表结构 -->
 
<property name="hbm2ddl.auto">update</property>


2. 第一个例子工程:
  <1> 需要创建的类
    * domain<领域模型>: User: id(int), name(string)
    * dao: UserDao: save, delete, update, get, find(int first, int max).
    * 实现实体映射与实体的增删改查与分页查询(HQL)。 
  <2> Hibernate 对实体的要求:
    * 有默认的构造方法;
    * 推荐提供一个标识属性(与业务无关的 id );
    * 推荐此类不是 final 的(对懒加载有影响);
    * 推荐重写 hashCode 与 equals 方法。

  <3> 属性映射:name,colum,type,length,not-null.
    * id映射与主键生成策略;unsaved-value:一个特定的标识属性值,用来标专该实例是刚刚创建的,尚未保存。默认是由 hibernate 选择一个合理的值。
    * 在 id 或 property 中指定 column 信息或使用 <column> 子元素。
    * 主键生成策略:identity, increment, ehilo, native.
    * 常用的映射类型:integer,string,date,timestamp,text,binary.
    * 时间类型映射:  生日(Date,date);
    * 大文本类型映射:描述(String,text);
    * 二进制类型映射:文件(byte[],binary);
  <4> Session的几个主要方法
    * save,persist,保存数据
    * delete,删除对象
    * update,更新对象,如果数据库中没有记录,会出现异常。
    * get,根据 ID 查,会立刻访问数据库。
    * Load,根据 ID 查,(返回的是代理,不会立即访问数据库)。
    * saveOrUpdate,merge,由 Hibernte 来确定是 save 或 update。


3. Hibernate 对象实例的三种状态与 session 的方法:
  <1> 三种状态:自由(瞬时)、持久、游离;
    * 自由(瞬时)状态:从未与任何 session 关联过,一般指新创建的对象实例。
    * 持久状态:目前正与 session 有关联,拥有持久化标识(相当于主键值),并且相关联的 session没有关闭,事务没有提交。持久对象状态发生改变,在事务提交时会更新到数据库。
    * 游离状态:曾经与 session 关联过,不过那个 session 已经关闭了。

    * 三种状态之间的转换(通过 session 的方法):
  <2> session 的方法:save(persist), delete, get, load.
    update:update 是把一个已经更改过的脱管状态的对象变成持久状态。
    saveOrUpdate(merge):[什么下情况添加什么情况下更新];
    使用 save 和 saveOrUpdate 方法时,如果被操作对象与另一个跟本 session 关联的 po 对象拥有相同的持久化标识 (identifier),就会抛出一个异常:org.hibernate.NonUniqueObjectException
    通常下面的场景会使用 update() 或 saveOrUpdate():程序在第一个 session 中加载对象,接着把session 关闭,该对象被传递到表现层,对象发生了一些改动,该对象被返回到业务逻辑层最终到持久层,程序创建第二 session 调用第二个 session 的 update() 方法持久这些改动。
    contains:Session是否包含某个对象(是否是持久状态);
    clear:清空一级缓存;
    flush:强制刷出(更新到数据库);  
  <3> load 与 get 的区别:
    * get 方法:如果找不到符合条件的纪录,返回 null。
    * load 方法:返回的是一个代理对象。在第一次访问这些懒加载对象(代理对象)的属性(getId方法除外)时,hibernate 会初始化这些代理。这时如果数据库中没有与之对应的记录,就会抛异常:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: ...。如果 PO 是 final 的,则load被调用时会马上发出一条select语句(即不能使用懒加载功能)。

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有