Hibernate二

1.1Hibernate的持久化类状态

1.1.1Hibernate的持久化类状态

  • 持久化类:就是一个实体类和数据库表建立了映射关系。

    • Hibernate为了方便的管理持久化类,将持久化类分成了三种状态。
  • 瞬时态(临时态)  transient
  • 持久态  persistent
  • 脱管态(游离态)  detached  

1.1.2 三种持久化对象的状态

  • 瞬时态  Transient

    • 不存在持久化标识OID,尚未与Hibernate的session关联,被认为处于瞬时态,失去引用将被JVM回收。换句话说,持久化对象没有唯一标识OID,没有纳入Session的管理。
  • 持久态  Persistent
    • 存在持久化标识OID,与当前session有关联,并且相关联的session没有关闭,并且事务没有提交。换句话说,持久化对象有唯一标识OID,已经纳入Session的管理,并且持久化持久态对象具有自动更新数据库的能力。
  • 脱管态 Detached
    • 存在持久化标识OID,但是没有与当前的session关联,脱管状态改变Hibernate不能检测到。换句话说,持久化对象有唯一的标识OID,没有纳入到session管理。

1.1.3区分三种持久化对象的状态

新建cn.hibernate3.demo1.Book.java类

package cn.hibernate3.demo1;
/**
 * 实体类
 * @author love
 */
public class Book {
    private Integer id;
    private String name;
    private Double price;
    private String author;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Double getPrice() {
        return price;
    }
    public void setPrice(Double price) {
        this.price = price;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }

}

配置Book.hbm.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入约束 -->
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.hibernate3.demo1.Book" table="book">
        <id name="id" column="id">
            <generator class="native"/>
        </id>
        <property name="name" column="name" type="java.lang.String"/>
        <property name="price" column="price" type="java.lang.Double"/>
        <property name="author" column="author" type="java.lang.String"/>
    </class>
</hibernate-mapping>

配置核心映射文件(hibernate.cfg.xml文件)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <!-- 配置数据库的基本信息 -->
    <!-- 驱动的名称 -->
    <property name="hibernate.connection.driver_class">
        com.mysql.jdbc.Driver
    </property>
    <!-- 访问数据库的url -->
    <property name="hibernate.connection.url">
        jdbc:mysql:///hibernate_day02
    </property>
    <!-- 用户名 -->
    <property name="hibernate.connection.username">root</property>
    <!-- 密码 -->
    <property name="hibernate.connection.password">root</property>
    <!-- 方言 -->
    <property name="hibernate.dialect">
        org.hibernate.dialect.MySQLDialect
    </property>
    <!-- C3P0连接池设定-->
    <!-- 使用c3po连接池  配置连接池提供的供应商-->
    <property name="connection.provider_class">
        org.hibernate.connection.C3P0ConnectionProvider
    </property>
    <!--在连接池中可用的数据库连接的最少数目 -->
    <property name="c3p0.min_size">5</property>
    <!--在连接池中所有数据库连接的最大数目  -->
    <property name="c3p0.max_size">20</property>
    <!--设定数据库连接的过期时间,以秒为单位,
        如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
    <property name="c3p0.timeout">120</property>
    <!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
    <property name="c3p0.idle_test_period">3000</property>
    <!-- 可选配置 -->
    <!-- 显示SQL -->
    <property name="hibernate.show_sql">true</property>
    <!-- 格式化SQL -->
    <property name="hibernate.format_sql">true</property>
    <!-- hbm:映射 2:to ddl:create drop alter -->
    <property name="hibernate.hbm2ddl.auto">update</property>
    <mapping resource="cn/hibernate3/demo1/Book.hbm.xml" />
</session-factory>
</hibernate-configuration>

新建HibernateUtils.java类

package cn.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Hibernate抽取工具类
 */
public class HibernateUtils {
    private static Configuration configuration;
    private static SessionFactory sessionFactory;
    static{
        configuration = new Configuration().configure();
        sessionFactory = configuration.buildSessionFactory();
    }

    public static Session openSession(){
        return sessionFactory.openSession();
    }

    public static void main(String[] args) {
        openSession();
    }
}

运行HibernateUtils工具类,即可发现创建了book表

测试

package cn.hibernate3.demo1;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.utils.HibernateUtils;

public class HibernateTest1 {
    @Test
    //区分持久化对象的三种装填
    public void demo1(){
        Session session = HibernateUtils.openSession();
        Transaction tx = session.beginTransaction();

        //向数据库中保存一本图书
        Book book = new Book();//瞬时态:没有唯一标识OID,没有与session关联
        book.setName("Hibernate开发");
        book.setAuthor("哈哈");
        book.setPrice(65.0);

        session.save(book);//持久态:有唯一标识OID,与session关联

        tx.commit();
        session.close();

        book.setName("Struts2开发");//脱管态:有唯一标识,没有与session关联

    }
}

1.1.4

      

时间: 2024-11-03 02:54:09

Hibernate二的相关文章

Hibernate(二)——POJO对象的操作

POJO对象其实就是我们的实体,这篇博客总结一下框架对POJO对象对应数据库主键的生成策略,和一些对POJO对象的简单增删改查的操作.  一,Hibernate框架中主键的生成策略有三种方式: 1,数据库负责生成主键(代理主键)  a,native:表示由设置的方言决定采用什么数据库生成主键方式,例如:在MySQL中会采用自增长的方式,主键字段必须都是整形类型:在Oracle数据库中,会采用序列的增长方式.  b,sequence:表示采用数据库的序列生成主键,适用于Oracle,DB2数据库中

hibernate(二)一级缓存和三种状态解析

序言 前一篇文章知道了什么是hibernate,并且创建了第一个hibernate工程,今天就来先谈谈hibernate的一级缓存和它的三种状态,先要对着两个有一个深刻的了解,才能对后面我要讲解的一对多,一对一.多对多这种映射关系更好的理 --WH 一.一级缓存和快照 什么是一级缓存呢? 很简单,每次hibernate跟数据库打交道时,都是通过session来对要操作的对象取得关联,然后在进行操作,那么具体的过程是什么样的呢? 1.首先session将一个对象加入自己的管理范围内,其实也就是把该

Hibernate(二)

Hibernate可以应用在任何使用JBDC的场合.    1.Java的客户端程序使用    2.Servlet或JSP的Web应用中使用 ===========================关联映射==========================种类:    一对多(多对一)关联    一对一关联    多对多关联方向:    单向关联    双向关联 1.单向一对多关联        步骤:        1)持久化类中添加关联类的相关属性和getter/setter方法      

Hibernate&lt;二&gt; 映射基础 单个持久类与单个数据库表映射

一.单个持久化类与单个数据库表映射基础 1.在Hibernate应用中,持久化类的访问方法有两个调用者: ①.Java应用程序:调用User对象的getXXX方法,读取User信息.调用setXXX方法,把用户输入的user信息写入到user对象中. ②.Hibernate:调用User对象的getXXX方法,读取user信息,把它保存到数据库调用user对象的setXXX方法,把从数据库中读出的user信息写入到user对象中.Hibernate的session在执行save().update

Hibernate(二)持久化对象的状态

简介 以前学习Hibernate的笔记,整理一下便发出来了,防止弄丢.有错误的话麻烦各位留言评论,感激不尽. 持久化类 Hibernate完成了从面向对象模型表示的对象至关系模型表示的数据结构的映射,可以用面向对象的方式来处理数据库中记录.通过映射文件或注解,将持久化类映射为数据库中的表,而不需要继承任何类或者接口(即,低入侵式设计)- 但有几点最基本的要求: - 无参构造器 - 标识属性,最好使用基本类型的包装类 - 相应的getter/setter方法 瞬态 由new创建的对象且未与Sess

Hibernate二次学习一----------搭建Hibernate

? 版权声明:本文为博主原创文章,转载请注明出处 [TOC] 1. 项目结构 本项目使用maven进行项目管理,搭建一个简单的Hibernate框架需要四步. 本项目未使用注解方式进行搭建 1.1 pom.xml 使用maven引入依赖jar包,若未使用maven,则自己下载所需jar包放到lib目录下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001

Hibernate介绍及入门级应用开发

一.Hibernate出现背景 介绍Hibernate之前,先了解一下为什么Hibernate会出现.一个技术的出现都是因为当前技术满足不了需求.在Hibernate出现之前,对数据库进行操作都是使用JDBC.但是JDBC有哪些优缺点呢?下面我们来详细分析. 1.JDBC优缺点分析: 优点:速度快: SQL 语句自己写,把控性好. 缺点:代码冗余,频繁的trycatch操作 查询代码特别繁琐 不同的数据库SQL语句有差异,代码的可移植性差 没有数据缓存 不是面向对象 就是因为JDBC的这些缺点,

Hibernate的优缺点:

1.Hibernate的优缺点:优点:1.程序更加面向对象:2.提高了生产率:3.方便移植(修改配置文件):4.无侵入性.缺点:1.效率比JDBC略差:2.不适合批量操作. 总的来说,hibernate的缺点主要有以下几点:一.由于对持久层封装过于完整,导致开发人员无法对SQL进行优化,无法灵活使用JDBC的原生SQL,Hibernate封装了JDBC,所以没有JDBC直接访问数据库效率高.要使用数据库的特定优化机制的时候,不适合用Hibernate 二.框架中使用ORM原则,导致配置过于复杂,

Hibernate框架(一)总结介绍

作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷.利用Hibernate框架我们就可以不再编写重复的JDBC代码,不再反复的测试我们的SQL语句写的如何.这里这需要我们简单配置,调用框架给我们提供的方法,就可以完成对数据增删改查的,那么Hibernate到底是个什么样的框架呢?如何使用呢?先看一个关于Hibernate框架的知识体系图: 这篇博客,我们来总结一下,Hibernate宏观的认识和,环