新随笔  :: 订阅 订阅  :: 管理

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各种状态转换方法分析