hibernate核心API

configuration

   //第一步:加载hibernate核心配置文件
   //      在hibernate内封装对象
   Configuration cfg = new Configuration();
   cfg.configure();
这一步的操作会使得程序找到src下面的hibernate.cfg.xml文件,创建对象,吧配置文件放到对象里面,实际上就是加载核心配置文件

SessionFactory(重点)

1、使用configuration对象创建sessionFactory对象

1)创建SessionFactory对象的过程中所做的事情:
 根据核心配置文件的数据库配置、映射文件配置部分到数据库中根据映射文件创建对应的表,此项功能的前提条件是在hibernate的核心配置文件hibernate.cfg.xml中配置如下语句:
    <property name="hibernate.hbm2ddl.auto">update</property> <!-- 自动创建表 -->

比较重要的一点就是,sessionFactory对象的创建很耗资源:

如果采用如上的语句,并且我们在主程序里面加载SessionFactory的时候,每一次的运行都需要加载一次配置文件。导致程序运行的效率比较低。因为我们在创建sessionFactory过程中都要去检查是否已经创建了对应的表。

解决的办法是什么呢?

就是一般在一个hibernate操作中,一个项目只创建一个sessionFactory对象,就类似于ServletContext对象,一次创建就“存活”在整个程序运行的过程中。

具体的实现

1)编写一个工具类,用静态的代码块实现,这是因为静态代码块在类加载的时候创建,而且只创建一次
package cn.lzb.utils;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class SessionFactoryUtils 
    static SessionFactory seFactory = null;
    static Configuration cfg = null;
    static {
    //1、加载核心配置文件
    cfg = new Configuration();
    cfg.configure();
    //2、创建sessionFactory
    seFactory = cfg.buildSessionFactory();
    }

    //构造方法返回sessionFactory
    public static SessionFactory getSessionFactory() {
        return seFactory;
    }
}

运行类测试由本人原来示例中的 超简易版hibernate第一个程序实现 的HibernateDemo.java 更改为如下内容

package cn.lzb.hibernatetest;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import cn.lzb.entity.User2;
import cn.lzb.utils.SessionFactoryUtils;

public class HibernateDemo {
    @Test
    public void testAdd() {
        //第一步:加载hibernate核心配置文件
        //        在hibernate内封装对象
        //Configuration cfg = new Configuration();
        //cfg.configure();

        //第二步:创建SessionFactory对象
        //        读取核心配置文件内容,根据映射关系在数据库中创建对应的表
        //SessionFactory seFactory = cfg.buildSessionFactory();
        SessionFactory seFactory = SessionFactoryUtils.getSessionFactory();

        //第三步:使用SessionFactory工具类创建session对象
        Session session = seFactory.openSession();

        //第四步:开启事务
        Transaction tx = session.beginTransaction();

        //第五步:写具体的crud操作
        User2 user = new User2();
        user.setUname("zs");
        user.setPassword("lzb");
        user.setAddress("CQ");
        //调用session的方法进行添加
        session.save(user);

        //第六步:提交事务
        tx.commit();

        //第七步:关闭事务
        session.close();
        seFactory.close();

    }
}

值得注意的是:如果是在一个web项目中,SessionFactory是不需要像实例中的那样关闭的。采用本文 示例中的方式,当第一次使用完毕之后就关闭的话,第二次在调用的时候就无法再调用了,因为静态的代码块只执行一次

session(重点)

1、类似与于jdbc中的connection。对数据库的操作都是通过sesion里面的不同方法来实现crud操作

1)添加:save方法
2)修改:update
3)删除:delete方法
4)根据主键查询:load方法和get方法
5)用于数据库操作对象:createQuery()和createSQLQuery()
6)条件查询:createCriteria方法
等等

2、session对象是一个单线程对象,具体的含义是什么呢,就是不能共享使用。最简单的解释就是,我们手中的钱只能够让我们自己使用。在程序中的理解就是,类似于web中的session对象,当用户访问一个网站的时候,后台会创建一个session对象来跟踪一个用户,但是这个对象仅代表当前用户,其他的用户登录时依然需要重新创建session对象。在hibernate中的session对象虽然是与web的session是两个不同的概念,但是借此来解释也是很不错的例子。总结来说,hibernate的session对象有什么特点呢?

1)session对象不能共用,只能够自己使用

Traansaction事务对象

Transaction tx = session.beginTransaction();

在事务对象的操作过程中,必须要有两个事务的操作方法:

1)commit方法:事务的提交
2)rollback方法:事务的回滚

在以上的实例中,代码内容并不是很规范,例如没有异常的处理,但考虑到作为演示的目的,觉得已经达到了这样一个目标,故不作多余的赘述

在此对事务以及事务的四个特性进行简要的介绍

事务:就是应用程序中一系列的操作

事务的四大特性:

1)原子性:事务包含的一系列的操作中要么都完成,要么都不被成功执行。

2)一致性:事务执行的结果必须使得数据库从一个状态变成为另一个一致的状态。

3)隔离性:一个事务的执行不能收到其他事务执行的干扰,也就是说,一个事务执行的数据对象,对其他的事务而言是被隔离起来不可操作的。

4)持续性:一个事务一旦提交,那么其对数据库中数据的改变是永久有效的,接下来的其他事务的操作都对该事务的结果有任何的影响
依赖对象(Dependent objects) 组件(Component)是一个被包含的对象,在持久化的过程中,它被当作值类型,而并非一个实体的引用。在这篇文档中,组件这一术语指的是面向对象的合成概念(而并不是系统构架层次上的组件的概念)。举个例子, 你对人(Person)这个概念可以像下面这样来建模: public class Person { private java.util.Date birthday; private Name name; private String key; public String getKey() { return key; } private void setKey(String key) { this.key=key; } public java.util.Date getBirthday() { return birthday; } public void setBirthday(java.util.Date birthday) { this.birthday = birthday; } public Name getName() { return name; } public void setName(Name name) { this.name = name; } ...... ...... } public class Name { char initial; String first; String last; public String getFirst() { return first; } void setFirst(String first) { this.first = first; } public String getLast() { return last; } void setLast(String last) { this.last = last; } public char getInitial() { return initial; } void setInitial(char initial) { this.initial = initial; } } 在持久化的过程中,姓名(Name)可以作为人(Person)的一个组件。需要注意的是:你应该为姓名的持久化属性定义getter和setter方法,但是你不需要实现任何的接口或申明标识符字段。 以下是这个例子的Hibernate映射文件: <!-- class attribute optional --> 人员(Person)表中将包括pid, birthday, initial, first和 last等字段。 就像所有的值类型一样, 组件不支持共享引用。 换句话说,两个人可能重名,但是两个Person对象应该包含两个独立的Name对象,只不过这两个Name对象具有“同样”的值。 组件的值可以为空,其定义如下。 每当Hibernate重新加载一个包含组件的对象,如果该组件的所有字段为空,Hibernate将假定整个组件为空。 在大多数情况下,这样假定应该是没有问题的。 组件的属性可以是任意一种Hibernate类型(包括集合, 多对多关联, 以及其它组件等等)。嵌套组件不应该被当作一种特殊的应用(Nested components should not be
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值