`
669098238
  • 浏览: 6329 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Hibernate Session 操作数据库的方法详解

    博客分类:
  • SSH
阅读更多

在讲Session 方法之前我们必须弄清在Hibernate 中一个实例对象的三种状态。

① 自由状态(transisent)又叫瞬时状态:对象被实例化但没有给对象的OID 属性赋值。

User user = new User();     这时的user 处于自由状态。

② 游离状态(detached)又叫托管状态:实例化对象的OID 属性也被赋值。

user.setId(1);          这时的user 处于游离状态。

③ 持久化状态(persistent):仅与一个Session 相关联。

session.save(user);  这时user 处于持久化状态。

粗略地可以这样认为:当一个实例对象的OID 被赋值,并且在数据库中叶有这样一条记录存在,那么这个对象就是持久对象;当一个实例对象的OID 也被赋值,但在数据库中没有这样的一条记录时,该对象就处于游离状态。

现在我们来讲当Session 中的方法来操作游离对象和持久对象有什么区别:

㈠ 操作游离对象

User user = new User();
user.setId(1);
user.setName("Joe");

save() 方法:

session.save(user);
这时Hibernate 会执行一条SQLINSERT 语句。当数据库存在这条记录时,会抛出异常。

saveOrUpdate()方法:

session.saveOrUpdate(user);

当数据库中没有这条有记录时,Hibernate 会执行一条SQLINSERT 语句。当数据库中有这条记录时,Hibernate的脏检查机制会自动检查游离对象的属性值与数据库中对应的字段值是否一样。如果一样就什么也不做;如果不一样就执行SQLUPDTE 语句。

比如:这时的user 对象的属性 name = "Joe",数据表 t_user 的字段 name = "Joe",Hibernate 什么也不会做,当数据表 t_user 的字段 name = "JOJ" ,那么Hibernate 就会执行一条SQLUPDATE 语句。

persist() 方法:

这个方法基本和save() 方法的用法一样。

update() 方法:

session.update(user);

当数据库中存在这条记录时,Hibernate 总会执行一条SQLUPDATE 语句;当数据库中不存这条记录时,就会抛出异常。

delete() 方法:

session.delete(user);

当数据库中存在这条记录时,Hibernate 总会执行一条SQLDELETE 语句;当数据库中不存这条记录时,就会抛出异常。

merge() 方法:

这个方法基本和saveOrUpdate() 方法的用法相似。

lock() 方法:

session.lock(user,LockMode.NONE);  //必须在后面有一条setter 方法,不然Hibernate 什么也不会做。

user.setAge(29);

当数据库中存在这条记录时,Hibernate 总会执行一条SQLUPDATE 语句;当数据库中不存这条记录时,就会抛出异常。

replicate() 方法:

session.replicate(user,ReplicationMode.EXCEPTION);

这个方法基本和save() 方法和 persist() 方法的用法相似。



㈡ 操作持久状态对象

load() 方法:通过OID 从数据库中抓取数据,并把数据加载到一个新实例对象上。

User user =(User) session.load(User.class, 1);   // 此时的 user 处于持久状态

调用这个方法时,当数据库中存在这条记录时,Hibernate 会执行一条 SQLSELECT 语句;当数据库中没有这条记录时,会抛出异常。

get() 方法:通过OID 从数据库中抓取数据,并把数据加载到一个新实例对象上。

User user = (User) session.get(User.class, 1);  // 此时的 user 处于持久状态

调用这个方法时,当数据库中存在这条记录时,Hibernate 会执行一条 SQLSELECT 语句;当数据库中没有这条记录时,user = null。

save() 方法:

User user = (User) session.load(User.class, 1);
user.setName("JOE");
session.save(user);

Hibernate的脏检查机制会自动检查对象的属性(name)值与数据库中对应的字段(name)值是否一样。如果一样就什么也不做;如果不一样就执行SQLUPDTE 语句。

saveOrUpdate()方法:这时的saveOrUpdate() 和 save() 方法用法一样。

persist() 方法:与 save() 方法一样。

update() 方法:与 save() 方法一样。

delete() 方法:

session.delete(user);

Hibernate 执行一条 SQLDELETE 语句,这时 user 变为游离状态。

merge() 方法:与 update() 方法一样。

lock() 方法:与 update() 方法一样。

session.lock(user,LockMode.NONE);  //此时不必在后面有一条setter 方法。

replicate() 方法:与 update() 方法一样。

session.replicate(user,ReplicationMode.EXCEPTION);

flush() 方法:与 update() 方法一样。

User user = (User) session.load(User.class, 1);
user.setName("JOE");
session.flush();

refresh() 方法:

User user = (User) session.get(User.class, 1);
user.setName("JOE");
session.flush();
session.refresh(user);

########################################################################################################

clear() 方法:清空Session 缓存

session.clear();

evcit() 方法:把持久对象从Session 缓存中移除。

session.evcit(user);


分享到:
评论

相关推荐

    Hibernate配置各种数据源详解

    —为true表示将Hibernate发送给数据库的sql显示出来 –> ”show_sql”>true <!– SQL方言,这边设定的是MySQL –> ”dialect”>net.sf.hibernate.dialect.MySQLDialect</property> <!– 一次读的数据库记录数 –...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.3 使用Hibernate操作数据库的示例 12.3.1 创建数据库表 12.3.2 编写表对应的JavaBean 12.3.3 编写JavaBean对应的Xml 12.3.4 编写Hibernate的配置文件 12.3.5 编写并验证测试程序 12.4 Hibernate的配置文件 12.4.1...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     3.5 通过Hibernate API操纵数据库  3.5.1 Hibernate的初始化  3.5.2 访问Hibernate的Session接口  3.6 运行helloapp应用  3.6.1 创建运行本书范例的系统环境  3.6.2 创建helloapp应用的目录结构  3.6.3 把...

    Hibernate实战(第2版 中文高清版)

     11.1 传播Hibernate Session   11.1.1 Session传播的用例   11.1.2 通过线程局部传播   11.1.3 利用JTA传播   11.1.4 利用EJB传播   11.2 利用Hibernate的对话   11.2.1 提供对话保证   11.2.2 利用...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.3 使用Hibernate操作数据库的示例 12.3.1 创建数据库表 12.3.2 编写表对应的JavaBean 12.3.3 编写JavaBean对应的Xml 12.3.4 编写Hibernate的配置文件 12.3.5 编写并验证测试程序 12.4 Hibernate的配置文件 12.4.1...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    12.3 使用Hibernate操作数据库的示例 12.3.1 创建数据库表 12.3.2 编写表对应的JavaBean 12.3.3 编写JavaBean对应的Xml 12.3.4 编写Hibernate的配置文件 12.3.5 编写并验证测试程序 12.4 Hibernate的配置文件 12.4.1...

    hibernate 框架详解

    实现一个默认的(即无参数的)构造方法(constructor) 5.1.3. 提供一个标识属性(identifier property)(可选) 5.1.4. 使用非final的类 (可选) 5.2. 实现继承(Inheritance) 5.3. 实现equals()和hashCode...

    低清版 大型门户网站是这样炼成的.pdf

    5.1.10 使用hibernate的isinitialized()与initialize()方法 277 5.1.11 持久化对象间的级联操作 277 5.2 hibernate的检索策略 291 5.2.1 立即检索 291 5.2.2 延迟检索 296 5.2.3 迫切左外连接检索 300 5.3 hql...

    J2EE应用开发详解

    29 3.2.2 Class.forName()加载类的实例 30 3.2.3 loadClass获得类的实例 31 3.3 操作类的字段 31 3.3.1 获取对象的属性 31 3.4 操作类的方法 34 3.4.1 运行时调用对象的方法 34 3.4.2 无参构造函数 36 3.4.3 带参...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    12.3 使用Hibernate操作数据库的示例 12.3.1 创建数据库表 12.3.2 编写表对应的JavaBean 12.3.3 编写JavaBean对应的Xml 12.3.4 编写Hibernate的配置文件 12.3.5 编写并验证测试程序 12.4 Hibernate的配置文件 12.4.1...

    JAVA高并发高性能高可用高扩展架构视频教程

    高并发复用数据库链接技术详解之数据库连接池 类加载器的高级特性(自定义类加器实现加密解密) iBATIS开源主流框架(实现半自动化hibernate) 企业实用技能之详解(眼睛横纹模式验证码防止恶意登陆) 动态页面的静态化...

    Java Web程序设计教程

    13.2.3jdbctemplate提供的常用数据操作方法 264 13.3spring中的事务处理 265 13.3.1spring事务处理概述 266 13.3.2编程式事务处理 266 13.3.3声明式事务处理 267 13.3.4标注式事务处理 268 13.4项目实战——...

    spring.doc

    3 Spring基本功能详解 8 3.1 SpringIOC 8 3.2别名Alias 11 别名拓展: 11 3.3 Spring容器内部对象的创建 12 Spring容器内部对象创建拓展: 12 3.3.1使用类构造器实例化(默认无参数) 14 3.3.2使用静态工厂方法实例化...

    Spring-Reference_zh_CN(Spring中文参考手册)

    3.3.3. bean属性及构造器参数详解 3.3.3.1. 直接量(基本类型、Strings类型等。) 3.3.3.2. 引用其它的bean(协作者) 3.3.3.3. 内部bean 3.3.3.4. 集合 3.3.3.5. Nulls 3.3.3.6. XML-based configuration metadata ...

    Spring中文帮助文档

    3.3.2. 依赖配置详解 3.3.3. 使用depends-on 3.3.4. 延迟初始化bean 3.3.5. 自动装配(autowire)协作者 3.3.6. 依赖检查 3.3.7. 方法注入 3.4. Bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用...

    Spring API

    3.3.2. 依赖配置详解 3.3.3. 使用depends-on 3.3.4. 延迟初始化bean 3.3.5. 自动装配(autowire)协作者 3.3.6. 依赖检查 3.3.7. 方法注入 3.4. Bean的作用域 3.4.1. Singleton作用域 3.4.2. Prototype作用...

Global site tag (gtag.js) - Google Analytics