Hibernate学习



一、Hibernate环境搭建
1.安装ant
直接解压缩即可,设置环境变量
需要设置的环境变量:
ANT_HOME:ant的安装目录
JAVA_HOME:jdk的安装目录
PATH:把%ANT_HOME%/bin目录加到path变量,以便于从命令行下直接运行ant
建立工程描述文件build.xml,在里面指定项目相关信息。
假定工具使用WSAD5.0,在Java  Source同级目录下建立bulid目录,里面拷入hibernate.properties、log4j.properties文件,拷入build.xml文件。
在build文件中修改一些xdoclit、hibernate等的lib绝对目录,指定java文件目录。

2. copy相应文件,建议建立一个hibernate_api的目录,里面copy入数据库驱动、log4j.jar、xdoclet、Hibernate等jar文件,以便ant编译时用。

3. 分析业务对象,确定关系,包括one to many,one to one等,建立VO对象,改对象只包括get,set方法。还要根据相映关系,在其中添加list或者object。完成后添加注释。注意还要为每个对象添加一个hibernate的主键,外间是hibernate自动生成的。

4. WSAD中建立项目,把build目录copy至和Java Source同级目录。在dos窗口下,转到相应的build目录中,运行:
ant -buildfile build_test.xml 
如果build文件名为build.xml,则直接运行ant命令即可,如果*.hbm.xml文件以及ddl文件正确生成,则表明环境配置正确。

5. 建立hibernate.cfg.xml文件,放在Java Source目录下,里面配置和DB2数据库的连接参数。运行build生成的ddl文件,命令:
db2 -stvf  xxxx.ddl
生成数据库表。

6. 建立相应的service文件和jsp文件,运行项目即可。

二、程序试验
此处举个最简单的例子来描述Hibernate的many-one用法。
假设有User和Group两个对象,User对象有

USERID
PASSWORD
REALNAME
EMAIL
这么几个简单字段,Group对象只有一个
GROUPNAME

USERID
PASSWORD
REALNAME
EMAIL
这么几个简单字段,Group对象只有一个
GROUPNAME

分别建立两个java类。
这里Group和User的关系是one-many。所以要在User中添加GroupPK的外键,这个是用build时候自动添加的。
创建service下的dao的文件GroupDAO.java和UserDAO.java,分别对两个对象做控制。再在service下创建TestService.java文件用来表示层交互。
运行http://localhost:9080/source/test/manageGroup.jsp 显示结果。

三、补充一些Hibernate的理念
1. 关于对象
java说,一切皆对象。对象的价值远不止是提供“存放数据的容器”。对象之间有着形形色色的关系。按照经典的面向
对象理论,对象之间的关系有包容、聚合、使用等等,类之间还有继承关系。正是由于这些丰富
的关系,对象才能成为真正有用的软件开发工具。
Hibernate 真正精彩之处,在于它能够很好地处理持久化对象之间的关系。换句话说,程序员
无须关心“对象之间的关系在数据库中如何存储”,只要按照最普通的方式使用对象,Hibernate
自然会把各种关系处理得妥妥帖帖。
2. 对象间的关系
Group和User是one-to-many的关系。在其同级的class目录下必须建立User.hbm.xml和Group.hbm.xml. 在其中要指定两个对象的关系。对于Group来说要添加<ont-to-many>节点,还要添加对User对象的容器引用方式。这里使用List,下面包括
 <list
            name="users"
            table="TSUser"
            lazy="false"
            inverse="false"
            cascade="all"
        >
这里有两比较重要的属性:lazy和cascade.
lazy指是否提供懒式加载(lazy loading),一般使用true来开启。
cascade指是否提供级联操作。如果值为all,表示,对Group 对象的删除、保存将导致级联地删除、保存与其相关的所有User对象;如果值为none,对User 对象的删除、保存不会引发对与其相关的Group对象做任何操作。
3. 关于主键
在每个.hbm.xml中提供<id>节点对主键的定义,里面有个重要的节点<generator>。Hibernate 提供了4 种主键生成策略:Hi/Low、UUID、Identity 和Assigned,前三种
策略都是由数据库自动生成主键;Assigned 策略则是由client 代码将主键值赋予对象,然后存入数据库。
4. 关于O/R映射
O/R 映射是指这样一种操作:它试图将Java 对象的状态映射到RDBMS 的数据上,以便提供透明的持久化操作。
,O/R 映射与传统意义上的“数据库设计”的目标大相径庭,尽管它们操作
的是同一个对象——关系数据库。关系数据库设计的目标是以最少冗余度完整地保存数据;而O/R 映射的目标则是简便地持久化业务模型中的实体对象,使开发人员得以避免编写数据访问的代码。
我们可以(不太严谨地)把常见的企业级应用分为两类:OLTP(联机事务处理)和OLAP(联机分析处理)。前者的主要任务是完成一组业务,数据存储为业务处理服务;后者的主要任务是对现有的大量数据进行查询分析,提供各种报表乃至决策支持,一切的工作都围绕着现有数据展开。显然,O/R 映射适用的范畴被严格地限制在OLTP 之内。OLAP 是完全不必考虑使用O/R映射的,那是另一个完全不同的世界。
5. 对象结构模型示例

对该图的一些解释:
持久层的DAO(Data Access Object,数据访问对象)从持久化介质读取数据、组装成实体;业务层的service 对象使用实体进行业务操作,组装DTO(Data Transfer Object,数据传输对象);展示层将DTO携带的数据以某种形式展现给用户。
对于事务管理,放在业务层来进行,对每一个service方法进行一次完整的事务,其效果就是全有或全无。如果把事务放在持久层,会造成很大的性能损失,比如EJB。
DTO看上去和实体相当相似,但扮演完全不同的角色。实体是物理世界在软件系统中的对应物,DTO则是展示层所需数据的封装。
对于DAO的设计非常简单,无需考虑事务,只需实现以下几个方法:
public Entity create();
public Object load(Long id);
public void update(Entity entity);
public void remove(Entity entity);

6. 类结构示例


7. 补充
面向对象的开发方法是当今的主流,但是同时我们不得不使用关系型数据库,所以在企业级应用开发的环境中,对象、关系的映射(ORM)是一种耗时的工作。Hibernate是一种新的ORM映射工具,它不仅提供了从Java类到数据表之间的映射,也提供了数据查询和恢复机制。相对于使用JDBC和SQL来手工操作数据库,使用Hibernate,可以大大减少操作数据库的工作量。

四、Hibernate查询语言:HQL
首先明确HQL语句是区分大小写的。
1. from语句
from eg.Cat  这里Cat是对象名,而不是表名。通常我们会起个别名,如
eg.Cat as cat 。as可以省略。

2. select语句
就是要确定你要从查询中返回哪些对象或者哪些对象的属性。写几个例子吧:
select employee form Employee as employee
select employee form Employee as employee where employee.Name like 'J%'
select employee.Name form Employee as employee where employee.Name like 'J%'
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee right join Department as department on employee.DepNo=department.ID
此处也可以用inner join 和 outer join,用法和SQL相似。

3. 数学函数
HQL同样支持avg(...), sum(...), min(...), max(...) ,count(*) ,count(...), count(distinct ...), count(all...) 等,其用法和SQL基本相同,如
select distinct employee.name from Employee as employee
select count(distinct employee.name),count(employee) from Employee as employee

4. polymorphism
from com.test.Animal as animal
不光得到所有Animal得实例,而且可以得到所有Animal的子类(如果我们定义了一个子类Cat)
一个比较极端的例子
from java.lang.Object as o  
可以得到所有持久类的实例

5. where语句
定义查询语句的条件,举几个例子吧:
from Employee as employee where employee.Name='Jplateau'
from Employee as employee where employee.Name like 'J%'
from Employee as employee where employee.Name like '%u'
在where语句中“=”不光可以比较对象的属性,也可以比较对象,如:
select animal from com.test.Animal as animal where animal.name=dog

6. 表达式
大家知道在SQL中进行传递参数进行查询的时候,我们通常用PreparedStatement,在语句中写一大堆的“?”,在hql中也可以用这种方法,如:
List mates = sess.find("select employee.name from Employee as employee " +
"where employee.Name=? ",name,Hibernate.STRING);
(说明:上面利用Session里的find方法,在hibernate的api Session中重载了很多find方法,它可以满足你多种形式的查询)
上边是一个参数的情形,这种情况下紧接着引入参数和定义参数的类型,当为多个参数,调用另一个find方法,它的后两个参数都是数组的形式
还有另外一种方法来解决上边的问题,如:
Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");
q.setString("name", "Jplateau");
//当有多个参数的时候在此逐一定义
Iterator employees = q.iterate();

7. 子查询
hibernate同样支持子查询,写几个例子:
from eg.Cat as fatcat where fatcat.weight > ( select avg(cat.weight) from eg.DomesticCat cat )

8. Hibernate.cfg.xml的配置
<!-- properties -->
        <property name="connection.datasource">my/first/datasource</property>
        <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">false</property>
        <property name="use_outer_join">true</property>
        <property name="transaction.factory_class">net.sf.hibernate.transaction.JTATransactionFactory</property>
        <property name="jta.UserTransaction">java:comp/UserTransaction</property>

可以定义外连接、是否打印SQL等,具体参数参考JDK。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于学习Hibernate,我可以为你提供一些指导。Hibernate是一个Java持久化框架,用于将Java对象映射到关系数据库中。它简化了与数据库的交互,提供了ORM(对象关系映射)的功能。 如果你想学习Hibernate,以下是一些建议的步骤: 1. 了解基本概念:开始之前,建议你先了解一些Hibernate的基本概念,例如持久化、实体类、会话(Session)等。这将帮助你更好地理解Hibernate的工作原理。 2. 学习Hibernate配置:Hibernate使用一个配置文件来连接数据库和定义映射关系。你可以学习如何配置Hibernate以适应你的项目需求。这包括数据库连接配置、实体类映射等。 3. 学习Hibernate实体映射:Hibernate通过注解或XML文件将Java实体类映射到关系数据库表中。你可以学习如何使用注解或XML文件来定义实体类的映射。 4. 学习Hibernate查询语言(HQL):HQL是一种类似于SQL的查询语言,用于对数据库进行查询操作。学习如何使用HQL进行查询和操作数据库是很重要的。 5. 学习Hibernate事务管理:事务管理是在处理数据库操作时非常重要的一部分。学习如何使用Hibernate进行事务管理,包括开启事务、提交事务、回滚事务等。 6. 实践项目:最好的学习方法是通过实际项目来应用所学的知识。尝试在一个小型项目中使用Hibernate来进行数据库操作,这将帮助你更好地理解和掌握Hibernate的使用。 除了上述步骤,还有很多其他方面的内容可以学习,例如缓存管理、性能优化等。希望这些步骤能够帮助你入门Hibernate!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值