`
ttitfly
  • 浏览: 623892 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hibernate总结二

阅读更多
1. get和load区别
load加载方法:
Users user = (Users)session.load(Users.class, new Integer(1));

get加载方法:
Users user = (Users)session.get(Users.class, new Integer(1));

以上面代码为例:

区别一:如果没有id为1的Users对象,那么,如果通过get方法加载,则返回的是一个null,如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException

区别二:load支持延迟加载,get不支持延迟加载
也就是说:Users user = (Users)session.load(Users.class, new Integer(2));这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询,而Users user = (Users)session.get(Users.class, new Integer(1));则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, new Integer(2));不会执行任何sql.

Users user = (Users)session.load(Users.class, new Integer(2));
System.out.println(user.getId());

上面这2句代码,不会去执行数据库操作,也就是说不执行sql,因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是id的值,这里为2,值用到时去数据库加载。但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。

2.Hibernate里,对象都有三种状态:临时状态,持久状态,游离状态(也叫脱管状态)

临时状态:刚创建出来的对象一般都为临时状态,临时状态的对象的主键是没有值的,如果有值就是游离状态了。
持久状态:处于Hibernate的session范围之内,处于持久状态的对象的属性发生改变都会影响到数据库里的数据改变。
游离状态:和临时状态唯一区别就是主键有值

因为任何对象都有一个默认值,所以确认主键有没有值,是通过unsaved-value这个属性确定的。比如:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.domain.Users" table="users" >
        <id name="id" type="java.lang.Integer" unsaved-value="10">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="username" type="java.lang.String">
            <column name="name" length="20" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="20" />
        </property>
    </class>
</hibernate-mapping>


如果某个对象的id的值是10,那么就可以认为主键没有值。

3. persist(),save(),saveOrUpdate()区别

persist():只接受临时状态的对象,即主键没有值的对象,如果传递一个非临时状态的对象给它,则会抛出异常。

save():无论对象是否处于临时状态都会向数据库保存

saveOrUpdate():如果主键有值则执行update,如果主键没有值则执行insert


4.load()---->setXX() 和 update()区别
load()--->setXX():支持动态更新
update:不支持动态更新
动态更新需要在配置文件里加上:dynamic-update="true"
如:
<class name="com.domain.Users" table="users" dynamic-update="true">


以一个user表为例:
CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


表里有1条数据:
id   name       password
1    ttitfly    password1

通过load()---->setXX方式更新
Users user = (Users)session.load(Users.class, new Integer(1));
user.setPassword("testtest");

A:dynamic-update="false" 的时候,执行的sql:
    update
        users 
    set
        name=?,
        password=? 
    where
        id=?


可以看出本来只是对password进行修改,结果把name字段也给更新了。如果一个表里有很多字段,就会对效率产生影响。

B:dynamic-update="true" 的时候,执行的sql:
    update
        users 
    set
        password=? 
    where
        id=?

可以看出只对password进行更新。

当用update进行更新时:
Users user = new Users();
user.setId(new Integer(1));
user.setUsername("ttitfly");
user.setPassword("1234561");
session.update(user);
session.beginTransaction().commit();

即使dynamic-update="true" ,执行的sql为:
  update
        users 
    set
        name=?,
        password=? 
    where
        id=?

即 对所有字段都进行更新,所以说update时不支持动态更新的。

5. evict():从session缓存里清除某一个对象
    clear():从session缓存里清除所有对象
分享到:
评论
4 楼 cleverbing 2008-06-13  
3 楼 zhaojuan8 2008-03-12  
ttitfly 写道
1. get和load区别
load加载方法:
Users user = (Users)session.load(Users.class, new Integer(1));

get加载方法:
Users user = (Users)session.get(Users.class, new Integer(1));

以上面代码为例:

区别一:如果没有id为1的Users对象,那么,如果通过get方法加载,则返回的是一个null,如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException

区别二:load支持延迟加载,get不支持延迟加载
也就是说:Users user = (Users)session.load(Users.class, new Integer(2));这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询,而Users user = (Users)session.get(Users.class, new Integer(1));则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, new Integer(2));不会执行任何sql.

Users user = (Users)session.load(Users.class, new Integer(2));
System.out.println(user.getId());

上面这2句代码,不会去执行数据库操作,也就是说不执行sql,因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是id的值,这里为2,值用到时去数据库加载。但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。

2.Hibernate里,对象都有三种状态:临时状态,持久状态,游离状态(也叫脱管状态)

临时状态:刚创建出来的对象一般都为临时状态,临时状态的对象的主键是没有值的,如果有值就是游离状态了。
持久状态:处于Hibernate的session范围之内,处于持久状态的对象的属性发生改变都会影响到数据库里的数据改变。
游离状态:和临时状态唯一区别就是主键有值

因为任何对象都有一个默认值,所以确认主键有没有值,是通过unsaved-value这个属性确定的。比如:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.domain.Users" table="users" >
        <id name="id" type="java.lang.Integer" unsaved-value="10">
            <column name="id" />
            <generator class="native" />
        </id>
        <property name="username" type="java.lang.String">
            <column name="name" length="20" />
        </property>
        <property name="password" type="java.lang.String">
            <column name="password" length="20" />
        </property>
    </class>
</hibernate-mapping>


如果某个对象的id的值是10,那么就可以认为主键没有值。

3. persist(),save(),saveOrUpdate()区别

persist():只接受临时状态的对象,即主键没有值的对象,如果传递一个非临时状态的对象给它,则会抛出异常。

save():无论对象是否处于临时状态都会向数据库保存

saveOrUpdate():如果主键有值则执行update,如果主键没有值则执行insert


4.load()---->setXX() 和 update()区别
load()--->setXX():支持动态更新
update:不支持动态更新
动态更新需要在配置文件里加上:dynamic-update="true"
如:
<class name="com.domain.Users" table="users" dynamic-update="true">


以一个user表为例:
CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


表里有1条数据:
id   name       password
1    ttitfly    password1

通过load()---->setXX方式更新
Users user = (Users)session.load(Users.class, new Integer(1));
user.setPassword("testtest");

A:dynamic-update="false" 的时候,执行的sql:
    update
        users 
    set
        name=?,
        password=? 
    where
        id=?


可以看出本来只是对password进行修改,结果把name字段也给更新了。如果一个表里有很多字段,就会对效率产生影响。

B:dynamic-update="true" 的时候,执行的sql:
    update
        users 
    set
        password=? 
    where
        id=?

可以看出只对password进行更新。

当用update进行更新时:
Users user = new Users();
user.setId(new Integer(1));
user.setUsername("ttitfly");
user.setPassword("1234561");
session.update(user);
session.beginTransaction().commit();

即使dynamic-update="true" ,执行的sql为:
  update
        users 
    set
        name=?,
        password=? 
    where
        id=?

即 对所有字段都进行更新,所以说update时不支持动态更新的。

5. evict():从session缓存里清除某一个对象
    clear():从session缓存里清除所有对象

顶下  总结的不错
2 楼 Frezzz 2008-02-18  
非常不错,很详细!好
1 楼 jsea 2008-01-31  
实在太好了,解决了像我这样的新手很多疑惑!太感谢lz了。

相关推荐

    Hibernate知识点总结

    ### Hibernate知识点总结 #### 一、Hibernate概述 Hibernate是一个开源的ORM(Object Relational Mapping,对象关系映射)框架,用于Java应用与关系型数据库之间的交互。它通过使用描述对象和数据库之间映射的元...

    Hibernate4总结文档

    《Hibernate4总结文档》 Hibernate4作为一款强大的Java对象关系映射框架,简化了数据库操作,使得开发者可以更专注于业务逻辑而不是数据库层面的细节。本文将深入探讨Hibernate4的配置和使用,帮助开发者更好地理解...

    hibernate文档总结,技术汇总,PDF版的,hibernate简明参考文档

    2. **连接池**: Hibernate支持连接池技术,如C3P0或HikariCP,通过复用已打开的数据库连接,提高系统性能,避免频繁的连接创建和关闭。 3. **POJO(Plain Old Java Object)**: 在Hibernate中,POJO代表与数据库表...

    Hibernate 简单 PPT 总结

    【Hibernate 简单 PPT 总结】 Hibernate 是一个流行的开源对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作。通过提供一套API和元数据,Hibernate允许开发者将业务对象直接映射到数据库表,从而避免了...

    hibernate学习总结文档

    2. **读取(Read)**:`get()` 或 `load()` 方法用于根据主键获取对象,`query()` 或 HQL(Hibernate 查询语言)用于执行更复杂的查询。 3. **更新(Update)**:修改对象后,调用 `update()` 或 `merge()` 方法同步...

    struts2+hibernate一周小项目总结

    struts2+hibernate一周小项目总结

    SSH之Hibernate总结

    SSH之Hibernate总结 SSH(Struts、Spring、Hibernate)是Java Web开发中常见的三大框架,而Hibernate作为ORM(对象关系映射)框架,是连接Java应用程序与数据库的关键组件。本总结将围绕Hibernate的核心概念、配置...

    jdbc_Hibernate总结

    2. 创建配置文件`hibernate.cfg.xml`,其中包含数据库连接信息、日志格式等。 3. 设计实体类,对应数据库表中的记录,并提供对应的getter和setter方法以及无参构造器。 4. 为实体类编写映射文件(如`Xxx.hbm.xml`)...

    Hibernate学习笔记与总结

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

    Hibernate课程的总结

    **标题:“Hibernate课程的总结”** 在学习Hibernate框架的过程中,我们深入探讨了它在Java企业级应用中的核心地位。Hibernate作为一个强大的对象关系映射(ORM)工具,它简化了数据库与Java对象之间的交互,消除了...

    hibernate总结练习源码

    本资源包含的"hibernate总结练习源码"提供了对Hibernate ORM框架实际应用的实例,有助于深入理解和掌握其核心概念与功能。 1. **对象关系映射(ORM)**:Hibernate 提供了一种机制,将数据库中的表映射为Java类,表...

    hibernate技术研究对比总结

    **HIBERNATE技术总结** Hibernate 是一个流行的 Java 应用程序框架,它提供了一种对象关系映射(ORM)解决方案,将数据库操作转化为面向对象的编程。此文档旨在研究和对比 Hibernate 技术的不同方面,帮助开发者更...

    Hibernate注解用法总结

    本文主要总结了Hibernate中常见的注解用法,涵盖了类级别和属性级别的注解,以及与主键和非主键相关的注解。 1. 类级别注解: - `@Entity`: 这个注解是必不可少的,它告诉Hibernate一个Java类是一个实体,可以映射...

    Hibernate 二级缓存 总结整理

    **Hibernate 二级缓存总结整理** 在Java的持久化框架中,Hibernate是一个广泛使用的ORM(对象关系映射)工具,它极大地简化了数据库操作。在处理大数据量或高并发的场景下,为了提高性能和减少数据库负载,...

    Hibernate总结——课程管理

    2. **读取(Read)** 使用`Session.get()`或`Session.load()`根据主键获取对象,或者使用`Session.createQuery()`或`Session.createCriteria()`执行HQL(Hibernate查询语言)或SQL查询。 3. **更新(Update)** ...

    hibernate 总结 附 项目

    2. **持久化类(Persistent Class)**: 实体类需要被标记为持久化类,以便 Hibernate 可以识别并管理它们。通常使用 `@Entity` 注解来完成这一操作。 3. **ID(Identifier)**: 每个实体都有一个唯一的 ID,对应...

    Hibernate重点总结

    2. **配置** - **hibernate.cfg.xml**: Hibernate的主配置文件,包含数据库连接信息、方言设置、缓存配置等。 - **实体映射文件(hbm.xml)**: 定义Java类与数据库表之间的映射关系,包括字段映射、主键生成策略等...

    Hibernate总结(三)

    《Hibernate总结(三)》 在本篇关于Hibernate的总结中,我们将深入探讨这个流行的Java对象关系映射(ORM)框架的关键概念和技术细节。Hibernate作为一款强大的工具,它极大地简化了Java开发人员处理数据库操作的工作...

Global site tag (gtag.js) - Google Analytics