`
isiqi
  • 浏览: 16344330 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Hibernate 学习笔记(1)

阅读更多

学会用20%时间和记忆去完成80%的工作!<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Hibernate中实体对象的生命周期

lTransient-瞬间状态

当直接使用new创建出对象,例如用User类所衍生出的对象,在还没有使用save()方法之前都是暂存对象,这些对象还没有与数据库发生任何关系,不与数据库的任何记录对应。

lPersistent-持久状态

当对象与数据库中的数据有对应关系,与session实例(尚未关闭)有关联。如将对象用session.save()方法存储,或用session.get()/load()方法从数据库加载数据并封装为对象,此对象进入持久状态。

lDetached-分离状态

当Persistent状态的对象的事务执行commit()之后或一级缓存执行了flush()操作,数据库中的对应数据也会跟着更新。如果你将session实例关闭close(),则Persistent状态的对象会成为Detached状态;而当你使用session的实例的delete()方法删除数据,Persistent状态的对象由于失去了对应的数据,成为Transient状态。

Detached状态的对象可以使用update()方法使之与数据库中的对应数据再度发生关联,此时Detached状态的对象会变为Persistent状态。

简要的Hibernate体系结构的概要图

Hibernate核心接口

lSessionFactory(org.hibernate.SessionFactory)

针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。他是生成Sessinon的工厂,本身要用到ConnectionProvider。该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可循的二级缓存。

lSession(org.hibernate.Session)

表示应用程序与持久储存层之间交换操作的一个单线程对象,此对象生存期很短。其隐藏了JDBC连接,也是Transaction的工厂。其会吃用一个针对持久话对象的必选(第一级)缓存,在遍历对象图或跟据持久化标识查找对象时会用到。

l持久对象及其集合

带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。这些对象可能是普通的JavaBean/POJO,唯一特殊的是他们正与(仅仅一个)Session相关联,一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用(例如作表示层的数据传输对象)。

l瞬态(Transient)和脱管(Detached)的对象及其集合

l事务(Transaction(org.hibernate.Transaction))

(可选的)应用程序用来制定原子操作单元范围的对象,它是单线程的,生命周期很短。他通过抽象将用用从底层具体的JDBC、JTA以及CORBA事务隔离开。某些情况下,一个Session之内可能包含多个Transaction对象。尽管是否使用该对象是可选的,但无论是使用底层的API还是使用Transaction对象。事务边界的开启与关闭是必不可少的。

lConnectionProvider(org.hibernate.connection.ConnectionProvider)

(可选的)申城JDBC连接的工厂(同时也起到连接池的作用)。它通过抽象将应用从底层的Datasource或DriverManager隔离开。仅供开发者扩张/实现用,并不暴露给应用程序使用。

lTransactionFactory(org.hibernate.TransactionFactory)

(可选的)生成Transaction对象实例的工厂。仅供开发者扩展/实现用,并不暴露给应用程序使用。

配置MyEclipse环境使用Hibernate

hibernate3.jar是必要的,而在lib目录中还包括了许多jar文件,您可以在Hibernate3.0官方的参考手册上找到这些jar的相关说明,其中必要的是antlr、dom4j、CGLIB、asm、CommonsCollections、CommonsLogging、EHCache,Hibernate底层还需要JavaTransactionAPI,所以您还需要jta.jar,到这边为止,总共需要以下的jar文件:

Hibernate可以运行于单机之上,也可以运行于Web应用程序之中,如果是运行于单机,则将所有用到的jar文件(包括JDBC驱动程序)设定至CLASSPATH中,如果是运行于Web应用程序中,则将jar文件置放于WEB-INF/lib中。
如果您还需要额外的Library,再依需求加入,例如JUnit、Proxool等等,接下来可以将etc目录下的log4j.properties复制至Hibernate项目的Classpath下,并修改一下当中的log4j.logger.org.hibernate为error,也就是只在在错误发生时显示必要的信息。

接着设置基本的Hibernate配置文件,可以使用XML或Properties文件,这边先使用XML,文件名预设为hibernate.cfg.xml

说明:这边以一个简单的单机程序来示范Hibernate的配置与功能。

准备工作

lMyEclipse配置如前所述

l建立持久化类

l数据库的准备工作,在MySQL中新增一个demo数据库,并建立user表格:

CREATETABLEuser(idINT(11)NOTNULLauto_increment PRIMARYKEY,nameVARCHAR(100)NOTNULLdefault'',ageINT);

l建立持久化类

l建立持久化类的映射文件

l编写Java的测试应用程序

建立持久化类

publicclassUser{
privateIntegerid;
privateStringname;
privateIntegerage;
//必须要有一个预设的建构方法
//以使得Hibernate可以使用Constructor.newInstance()建立对象
publicUser(){
}
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicIntegergetAge(){
returnage;
}
publicvoidsetAge(Integerage){
this.age=age;
}
}

其中id是个特殊的属性,Hibernate会使用它来作为主键识别,您可以定义主键产生的方式,这是在XML映像文件中完成,为了告诉Hibernate您所定义的User实例如何映射至数据库表格,您撰写一个XML映射文件名是User.hbm.xml,如下所示:

建立持久化类的映射文件User.hbm.xml

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-mapping
PUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>

<classname="onlyfun.caterpillar.User"table="user">

<idname="id"column="id"type="java.lang.Integer">
<generatorclass="native"/>
</id>

<propertyname="name"column="name"type="java.lang.String"/>

<propertyname="age"column="age"type="java.lang.Integer"/>

</class>

</hibernate-mapping>

<class>标签的name属性为所映像的对象,而table为所映像的表格;

<id>中column属性指定了表格字段,而type属性指定了User实例的中的id的类型,这边type中所设定的是直接指定Java中的对象类型,Hibernate也定义有自己的映射类型,作为Java对象与SQL型态的标准对应型态(因为语言所提供的类型并不一定与数据库的类型对应),这之后会再说明。

<id>中主键的产生方式在这边设定为"native",表示主键的生成方式由Hibernate根据数据库Dialect的定义来决定,之后还会介绍其它主键的生成方式。

同样的,<property>标签中的column与type都各自指明了表格中字段与对象中属性的对应。

接着必须在Hibernate配置文件hibernate.cfg.xml中指明映射文件的位置,如下加入映射文件位置:

修改Hibernate的配置文件hibernate.cfg.xml

<?xmlversion="1.0"encoding="utf-8"?>
<!DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

....

<!--对象与数据库表格映像文件-->
<mappingresource=“com/cstp/User.hbm.xml"/>

</session-factory>

</hibernate-configuration>

接下来编写一个测试的程序,这个程序直接以Java程序设计人员熟悉的语法方式来操作对象,而实际上也直接完成对数据库的操作,程序将会将一条数据存入表格之中:

publicclassFirstHibernate{
publicstaticvoidmain(String[]args){
//Configuration负责管理Hibernate配置讯息
Configurationconfig=newConfiguration().configure();
//根据config建立SessionFactory
//SessionFactory将用于建立Session
SessionFactorysessionFactory=config.buildSessionFactory();

//将持久化的对象
Useruser=newUser();
user.setName(“hhp”);
user.setAge(newInteger(30));

//开启Session,相当于开启JDBC的Connection
Sessionsession=sessionFactory.openSession();
//Transaction表示一组会话操作
Transactiontx=session.beginTransaction();
//将对象映像至数据库表格中储存
session.save(user);
tx.commit();
session.close();
sessionFactory.close();

System.out.println(“新增记录OK!请先用MySQL观看结果!");
}
}

持久性保存对象的一般步骤总结

l打开到数据源的一个会话

SessionsnSession=factory.openSession();

l开始一个事务

TransactiontTransaction=snSession.beginTransaction();

l创建希望持久性保存的对象,并且使用数据填充它们

Useruser=newUser();

user.setName("Michael");

user.setAge(40);

l保存对象到会话

snSession.save(user);

l提交修改到数据源并且关闭链接

tTransaction.commit();

snSession.close();

FirstHibernate.java测试程序

如您所看到的,程序中只需要直接操作User对象,并进行Session与Transaction的相关操作,Hibernate就会自动完成对数据库的操作,您看不到任何一行JDBC或SQL的声明产生,编写好以上的各个文件之后,各文件的放置位置如下:

着可以开始运行程序,结果如下:

Hibernate:insertintouser(name,age)values(?,?)
新增记录OK!请先用MySQL观看结果!

执行结果中显示了Hibernate所实际使用的SQL,由于这个程序还没有查询功能,所以要进入MySQL中看看新增的数据,如下:

mysql>select*fromuser;
+----+-------------+------+
|id|name|age|
+----+-------------+------+
|1|caterpillar|30|
+----+-------------+------+
1rowinset(0.03sec)

在第一个Hibernate中介绍如何使用Hibernate在不使用SQL的情况下,以Java中操作对象的习惯来插入数据至数据库中,当然储存数据之后,更重要的是如何将记录读出,Hibernate中也可以让您不写一句SQL,而以Java中操作对象的习惯来查询数据。

Hibernate例子-条件查询

publicclassSecondHibernate{

publicstaticvoidmain(String[]args){
Configurationconfig=newConfiguration().configure();
SessionFactorysessionFactory=config.buildSessionFactory();
Sessionsession=sessionFactory.openSession();

Criteriacriteria=session.createCriteria(User.class);
//查询user所有字段
Listusers=criteria.list();
Iteratoriterator=users.iterator();
System.out.println("id\tname/age");
while(iterator.hasNext()){
Useruser=(User)iterator.next();
System.out.println(user.getId()+
"\t"+user.getName()+
"/"+user.getAge());
}

//查询user中符合条件的字段
criteria.add(Expression.eq("name",“hhp"));
users=criteria.list();
iterator=users.iterator();
System.out.println("id\tname/age");
while(iterator.hasNext()){
Useruser=(User)iterator.next();
System.out.println(user.getId()+
"\t"+user.getName()+
"/"+user.getAge());
}

session.close();
sessionFactory.close();
}
}

Criteria对SQL进行封装,对于不甚了解SQL的开发人员来说,使用Criteria也可以轻易的进行各种数据的检索

您也可以使用Expression设定查询条件,并将之加入Criteria中对查询结果作限制,Expression.eq()表示设定符合条件的查询,

例如Expression.eq("name",“hhp")表示设定查询条件为"name"字段中为"caterpillar"的数据。

先来看一下执行结果:

Hibernate:selectthis_.idasid0_,this_.nameasname0_0_,this_.ageasage0_0_fromuserthis_
idname/age
1hhp/30
3tiantian/5
2zhangy/26

Hibernate:selectthis_.idasid0_,this_.nameasname0_0_,this_.ageasage0_0_fromuserthis_wherethis_.name=?
idname/age
1hhp/30

Criteria是对象导向式的查询方式,让不了解SQL的开发人员也可以轻易进行各项查询,但Criteria的API目前还不是很完善,而Hibernate鼓励的查询方式,是透过HQL(HibernateQueryLanguage)来进行,直接来看个实例:

Hibernate例子-HQL查询

publicclassSecondHibernate{

publicstaticvoidmain(String[]args){
Configurationconfig=newConfiguration().configure();
SessionFactorysessionFactory=config.buildSessionFactory();
Sessionsession=sessio

分享到:
评论

相关推荐

    hibernate学习笔记1

    【hibernate学习笔记1】 一、理解Hibernate Hibernate是一个流行的Java对象关系映射(ORM)框架,它的主要目的是简化数据库操作,通过将Java对象与数据库表进行映射,使得开发者能够以面向对象的方式处理数据,而...

    hibernate 学习笔记1

    ### 对象持久化与Hibernate学习笔记 #### 一、对象持久化的概念与重要性 - **定义**: 对象持久化是指将程序中的对象状态存储到持久化存储设备上的过程,以便在程序结束运行后仍然可以保留这些数据。 - **必要性**:...

    Hibernate学习笔记整理

    Hibernate学习笔记整理 以下是 Hibernate 框架的详细知识点: Hibernate 介绍 Hibernate 是一个 ORM(Object-Relational Mapping)框架,用于将 Java 对象映射到数据库表中。它提供了一个简洁的方式来访问和操作...

    Hibernate学习笔记特别详细

    《Hibernate学习笔记特别详细》 Hibernate,作为一款开源的Object-Relational Mapping(ORM)框架,为Java开发者提供了强大的数据库操作支持。它简化了数据库访问的复杂性,使得开发人员可以像操作对象一样操作...

    hibernate 学习笔记精要

    hibernate 学习笔记精要hibernate 学习笔记精要hibernate 学习笔记精要hibernate 学习笔记精要

    hibernate学习笔记

    在本篇《Hibernate学习笔记》中,我们将深入探讨Hibernate这一流行的Java对象关系映射(ORM)框架。Hibernate允许开发者以面向对象的方式处理数据库操作,极大地简化了数据存取的复杂性。以下是一些关键知识点: 1....

    Hibernate 学习笔记(全套)

    这套笔记是我学习Hibernate,进行相关技术点训练时记录下来的,其中包括技术点说明与相关事例,拿出来与大家分享。

    Java相关课程系列笔记之十四Hibernate学习笔记

    【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...

    Hibernate学习笔记与总结

    **Hibernate学习笔记与总结** Hibernate 是一款开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库上操作对象数据的便捷方式。本文将深入探讨Hibernate的核心概念、配置、实体类、映射文件、...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    传智播客 汤阳光 Hibernate 学习笔记

    传智播客 汤阳光 Hibernate 学习笔记,非常详细的hibernate学习资料!

    hibernate API帮助文档 及hibernate学习笔记

    Hibernate是一款强大的Java持久...通过阅读这份“Hibernate API帮助文档”和“Hibernate学习笔记”,你将能够深入理解Hibernate的工作原理,掌握其API的使用,并能在实际项目中有效地利用Hibernate进行数据持久化操作。

    hibernate学习笔记文档

    ### Hibernate 学习笔记知识点概览 #### 一、Hibernate 概述 - **定义**:Hibernate 是一款开源的对象关系映射(ORM)框架,它实现了将 Java 应用程序中的对象模型映射到关系型数据库中的记录。通过 ORM 技术,...

    hibernate学习笔记第二天的源码

    在深入探讨Hibernate学习笔记第二天的源码之前,我们先来理解一下Hibernate的核心概念。Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转化为对象模型,大大简化了数据访问层的开发...

Global site tag (gtag.js) - Google Analytics