5. Hibernate对数据的增删改查

5.1Hibernate加载数据

两种:get()、load()

一、 Session.get(Class arg0, Serializable arg1)方法

* arg0:需要加载对象的类,例如:User.class

* arg1:查询条件(实现了序列化接口的对象):

例"4028818a245fdd0301245fdd06380001"字符串已经实现了序列化接口。

返回值: 此方法返回类型为Object,也就是对象,然后我们再强行转换为需要加载的对象就可以了。

如果数据不存在,则返回null;

注:执行此方法时立即发出查询SQL语句。加载User对象

二、 Object Session.load(Class arg0, Serializable arg1) throws HibernateException

* arg0:需要加载对象的类,例如:User.class

* arg1:查询条件(实现了序列化接口的对象):例"4028818a245fdd0301245fdd06380001"字符串已经实现了序列化接口。

* 此方法返回类型为Object,但返回的是代理对象

* 执行此方法时不会立即发出查询SQL语句。只有在使用对象时,它才发出查询SQL语句,加载对象。

* 因为load方法实现了lazy(称为延迟加载、赖加载)

* 延迟加载:只有真正使用这个对象的时候,才加载(才发出SQL语句)

* hibernate延迟加载实现原理是代理方式。

* 采用load()方法加载数据,如果数据库中没有相应的记录,则会抛出异常对象不找到(org.hibernate.ObjectNotFoundException)

Hibernate两种加载数据方式的区别:

get()方法默认不支持lazy(延迟加载)功能,而load支持延迟加载

get()方法在查询不到数据时,返回null,而load因为支持延迟加载,只有在使用对象时才加载,所以如果数据库中不在数据load会抛出异常(org.hibernate.ObjectNotFoundException)。

get()和load()只根据主键查询,不能根据其它字段查询,如果想根据非主键查询,可以使用HQL。


5.2 hibernate更新数据:

建立使用hibernate进行更新数据时,先加载数据,然后再修改后更新。

否则一些字段可以会被null替换。

 try {
session = sf.openSession();
session.beginTransaction(); //手动构造一个Detaded状态的User
User user = new User();
user.setId("4028818a245fdd0301245fdd06380001");
user.setName("wjt276");
//Transient状态
/*
* 目前这样更新,数据库记录中此条记录,除了id、name字段为设置字段,其它均为null,因为对象其它
* 属性没有设置数据,因为更新数据时要先加载需要更新数据的对象,再修改更新。
redjk:以下为猜测的解决方案:
1不使用new的方式取得对象User。 直接写出User u=(User)session.get(User.class,’id’);
2摘录:
有几种方法可以达到此目的:
1、hibernate配置文件,设置不需要更新的字段属性为 update="false";
2、页面采用hidden控件;
3、使用hql的update语句手动更新字段;
4、使用megre方法更新数据(需要配置hibernate配置文件属性dynamic-update="true")。
。。。。。。
页面流程简单的时候,采用第一、二种方法都可以。如果流程多,每一步页面的元素不一样,这时候采用第四种就比较方便。第三种方法很灵活,但不到不得已不喜欢用,手写update,我已经不太习惯了~~
*/
session.update(user);//user为persistent状态 session.getTransaction().commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
session.getTransaction().rollback();
} finally{
if (session != null){
if (session.isOpen()){
session.close();
}
}
}

5.3 hibernate删除数据:

删除对象,一般先加载上来对象,然后再删除该对象。

对象删除后,对象状态为Transistent状态。

演示代码

 /**
* hibernate删除对象
*/
public void testDelete1(){
Session session = null; try {
session = HibernateUtils.getSession();
session.beginTransaction(); User user = (User)session.load(User.class, "4028818a245fdd0301245fdd06380001");
session.delete(user); session.getTransaction().commit();
} catch (HibernateException e) {
e.printStackTrace();
session.getTransaction().rollback();
} finally{
if (session != null){
if (session.isOpen()){
session.close();
}
}
}
//transistent状态(数据库中没有配区的数据记录。)
}

其他session方法见api。

相关说明见“

[转]Hibernate Session各种状态转换方法分析

Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查的更多相关文章

  1. CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移

    上一篇中我们已经使用CoreData创建了一个SQLite数据库 CoreData的简单使用(一)数据库的创建 现在对数据库进行数据的CRUD(增删改查) 1.Data Model 的设置 创建一个D ...

  2. Hibernate通过createSQLQuery( )方法实现增删改查

    一.项目结构 二.hibernate核心配置文件:   hibernate.cfg.xm <?xml version="1.0" encoding="UTF-8&q ...

  3. 2、hibernate七步走完成增删改查

    一.hibernate框架介绍如下 1.框架=模板 2.Hibernate是对象模型与关系数据库模型之间的桥梁 3.hibernate持久化概念 什么是ORM ORM是对象关系映射,是一种数据持久化操 ...

  4. Hibernate之API初识及增删改查实现

    声明:关于hibernate的学习.非常大一部分东西都是概念性的. 大家最好手里都有一份学习资料,在我的博文中.我不会把书本上的概念一类的东西搬过来.那没有不论什么意义.关于hibernate的学习, ...

  5. hibernate对单表的增删改查

    ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ...

  6. 啊啊啊啊啊啊啊今天就写,炒鸡简单 数据库Sqlite的创建,库的增删改查

    啦啦啦啦啦啦啦 写这个不用多长时间,我直接写代码注释都是些语句,Sql语句和Api来操作数据库 ,语句的参数我会注释 SQLite数据库创建数据库需要使用的api:SQLiteOpenHelper必须 ...

  7. hibernate与struts框架实现增删改查

    这里配置hibernate与struts不再过多赘述,配置搭建前文已经详细讲解,配置如下: hibernate.hbm.xml配置: <?xml version="1.0" ...

  8. Python sql数据的增删改查简单操作

    1.insert import mysql.connector import os import codecs #设置数据库用户名和密码 user='root';#用户名 pwd='root';#密码 ...

  9. day 47 Django 4的简单应用 创建简单的图书管理 (单表的增删改查)

    前情提要  Django  已经学了大半.. 很多东西已经能够使用在生产环境当中 一:模糊查询 二:单表删除 三:单表修改 四:图书管理 图书管理操作 视图结构 A:路由层 A :配置路由文件 参数解 ...

随机推荐

  1. ci总结

    1.创建模型,在模型中加载$this->load->database();2.在模型中写入想实现的功能方法3.在控制器中加载辅助函数和模型,$this->load->model ...

  2. toLocaleString

  3. OpenFlow Switch学习笔记(五)——Group Table、Meter Table及Counters

    本文主要详述OpenFlow Switch的另外两个主要组件——Group Table和Meter Table,它们在整个OpenFlow Swtich Processing中也起到了重要作用. 1. ...

  4. 蓝牙(Profile)构成

    蓝牙剖面(Profile)构成 蓝牙剖面(Profile)及其相互关系 蓝牙SIG定义13种蓝牙剖面及其相互关系如下图: 一个剖面若直接或间接采用了另一个剖面的部分或全部功能则称该剖面依赖于另一剖面. ...

  5. VIM键盘快捷键映射

    http://www.jianshu.com/p/216811be226b

  6. shell 脚本实战笔记(6)--集群环境配置检测

    1). 背景: 集群部署的时候, 需要一致的配置和环境设置. 对于虚拟机集群, 可以借助镜像拷贝, 复制和还原集群机器. 对与物理机集群而言, 则不一样, 如果机器一多, 多人去操作和配置, 对于成熟 ...

  7. ZOJ 1202 Divide and Count

    原题链接 题目大意:某人手上有一大批钻石,他同时有一些盒子恰好放下这些钻石,每个盒子可以放一个或多个,问一共有几种方法. 解法:这其实是一道排列与组合计算题,主要是写出组合算法的代码,把计算公式转为程 ...

  8. uva562 Dividing coins 01背包

    link:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. CentOS6.3 Hostname设定修改

    今天装了个CentOS6.3恩,基本上是参照百度文库上面的文章来安装的 http://wenku.baidu.com/link?url=K0tqotryKLFHhJGicx1nC-hsgfWhL3OI ...

  10. MySQL备份的shell脚本

    经过测试该脚本可以远程备份,但需要配置远程登录用户的权限,经过测试啊,在把这个脚本添加到计划任务的时候是无法识别mysql命令的(即使是将mysql添加到环境变量也无法识别,是因为/etc/cront ...