Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查
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对数据的增删改查的更多相关文章
- CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移
上一篇中我们已经使用CoreData创建了一个SQLite数据库 CoreData的简单使用(一)数据库的创建 现在对数据库进行数据的CRUD(增删改查) 1.Data Model 的设置 创建一个D ...
- Hibernate通过createSQLQuery( )方法实现增删改查
一.项目结构 二.hibernate核心配置文件: hibernate.cfg.xm <?xml version="1.0" encoding="UTF-8&q ...
- 2、hibernate七步走完成增删改查
一.hibernate框架介绍如下 1.框架=模板 2.Hibernate是对象模型与关系数据库模型之间的桥梁 3.hibernate持久化概念 什么是ORM ORM是对象关系映射,是一种数据持久化操 ...
- Hibernate之API初识及增删改查实现
声明:关于hibernate的学习.非常大一部分东西都是概念性的. 大家最好手里都有一份学习资料,在我的博文中.我不会把书本上的概念一类的东西搬过来.那没有不论什么意义.关于hibernate的学习, ...
- hibernate对单表的增删改查
ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ...
- 啊啊啊啊啊啊啊今天就写,炒鸡简单 数据库Sqlite的创建,库的增删改查
啦啦啦啦啦啦啦 写这个不用多长时间,我直接写代码注释都是些语句,Sql语句和Api来操作数据库 ,语句的参数我会注释 SQLite数据库创建数据库需要使用的api:SQLiteOpenHelper必须 ...
- hibernate与struts框架实现增删改查
这里配置hibernate与struts不再过多赘述,配置搭建前文已经详细讲解,配置如下: hibernate.hbm.xml配置: <?xml version="1.0" ...
- Python sql数据的增删改查简单操作
1.insert import mysql.connector import os import codecs #设置数据库用户名和密码 user='root';#用户名 pwd='root';#密码 ...
- day 47 Django 4的简单应用 创建简单的图书管理 (单表的增删改查)
前情提要 Django 已经学了大半.. 很多东西已经能够使用在生产环境当中 一:模糊查询 二:单表删除 三:单表修改 四:图书管理 图书管理操作 视图结构 A:路由层 A :配置路由文件 参数解 ...
随机推荐
- 《JS高程》引用类型学习笔记
2月圆满的结束了,结束之前是如凤凰般的涅槃.一边上班,一边搞科研的忙碌有点让人透不过气,心会不由得浮躁起来.但是,无论什么事情,只要充满耐心.专心去做,总会朝好的方向发展,心态真的很重要.Anyway ...
- smartmontools的安装使用和实现对磁盘的Nagios监控
安装 首先从sourceforge下载最新的安装版本. 解压编译 $ tar -zxvf smartmontools-6.4.tar.gz $ cd smartmontools-6.4 $ ./con ...
- iOS学习笔记---oc语言第七天
类的扩展 NSDate是Cocoa中用于处理日期和时间的基础类,封装了某一给定的时刻,具体的日期 时间和时区 使用+date方法获取当前日期和时间 NSDate *date = [NSDate dat ...
- 2016 ACM/ICPC Asia Regional Qingdao Online 1001/HDU5878 打表二分
I Count Two Three Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 整理的一些免费的Android项目实战系列视频教程
http://blog.itpub.net/29737144/viewspace-1212539/
- Codeforces Round #108 (Div. 2)
Codeforces Round #108 (Div. 2) C. Pocket Book 题意 给定\(N(N \le 100)\)个字符串,每个字符串长为\(M(M \le 100)\). 每次选 ...
- spark新能优化之数据本地化
数据本地化的背景: 数据本地化对于Spark Job性能有着巨大的影响.如果数据以及要计算它的代码是在一起的,那么性能当然会非常高.但是,如果数据和计算它的代码是分开的,那么其中之一必须到另外一方的机 ...
- android中的DatePicker与TimePicker
1.布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...
- 通过laravel理解IoC(控制反转)容器和DI(依赖注入)
原文地址: http://www.insp.top/learn-laravel-container ,转载务必保留来源,谢谢了! 容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器 ...
- java的nio之:java的nio系列教程之DatagramChannel
Java NIO中的DatagramChannel是一个能收发UDP包的通道.因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入.它发送和接收的是数据包. 打开 DatagramChann ...