Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查
Posted on 2014-04-02 13:53 redcoatjk 阅读(355) 评论(0) 编辑 收藏 举报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替换。
1 try { 2 session = sf.openSession(); 3 session.beginTransaction(); 4 5 //手动构造一个Detaded状态的User 6 User user = new User(); 7 user.setId("4028818a245fdd0301245fdd06380001"); 8 user.setName("wjt276"); 9 //Transient状态 10 /* 11 * 目前这样更新,数据库记录中此条记录,除了id、name字段为设置字段,其它均为null,因为对象其它 12 * 属性没有设置数据,因为更新数据时要先加载需要更新数据的对象,再修改更新。 13 redjk:以下为猜测的解决方案: 14 1不使用new的方式取得对象User。 直接写出User u=(User)session.get(User.class,’id’); 15 2摘录: 16 有几种方法可以达到此目的: 17 1、hibernate配置文件,设置不需要更新的字段属性为 update="false"; 18 2、页面采用hidden控件; 19 3、使用hql的update语句手动更新字段; 20 4、使用megre方法更新数据(需要配置hibernate配置文件属性dynamic-update="true")。 21 。。。。。。 22 页面流程简单的时候,采用第一、二种方法都可以。如果流程多,每一步页面的元素不一样,这时候采用第四种就比较方便。第三种方法很灵活,但不到不得已不喜欢用,手写update,我已经不太习惯了~~ 23 */ 24 session.update(user);//user为persistent状态 25 26 session.getTransaction().commit(); 27 } catch (HibernateException e) { 28 // TODO Auto-generated catch block 29 e.printStackTrace(); 30 session.getTransaction().rollback(); 31 } finally{ 32 if (session != null){ 33 if (session.isOpen()){ 34 session.close(); 35 } 36 } 37 }
5.3 hibernate删除数据:
删除对象,一般先加载上来对象,然后再删除该对象。
对象删除后,对象状态为Transistent状态。
演示代码
1 /** 2 * hibernate删除对象 3 */ 4 public void testDelete1(){ 5 Session session = null; 6 7 try { 8 session = HibernateUtils.getSession(); 9 session.beginTransaction(); 10 11 User user = (User)session.load(User.class, "4028818a245fdd0301245fdd06380001"); 12 session.delete(user); 13 14 session.getTransaction().commit(); 15 } catch (HibernateException e) { 16 e.printStackTrace(); 17 session.getTransaction().rollback(); 18 } finally{ 19 if (session != null){ 20 if (session.isOpen()){ 21 session.close(); 22 } 23 } 24 } 25 //transistent状态(数据库中没有配区的数据记录。) 26 }
其他session方法见api。
相关说明见“
[转]Hibernate Session各种状态转换方法分析”