入門 07 - 更新,刪除資料

如果您是在同一個Session中取出資料並想要馬上進行更新,則只要先查詢並取出物件,透過setXXX()方法設定好新的值,然後呼叫session.flush()即可在同一個Session中更新指定的資料,例如:
HibernateTest.java
import onlyfun.caterpillar.*;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
import java.util.*;

public class HibernateTest {
    public static void main(String[] args) throws HibernateException {
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

        Session session = sessionFactory.openSession();     
        List users = session.find("from User");

        User updated = null;
      
        for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
            User user = (User) iterator.next();
            if(updated == null)
                updated = user;
            
            System.out.println(user.getName() +
                                        "/n/tAge: " + user.getAge() +
                                        "/n/tSex: " + user.getSex());
        }
   
        updated.setName("justin");
        session.flush();

        users = session.find("from User");   
   
        session.close();
        sessionFactory.close();

        for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
            User user = (User) iterator.next();            
            System.out.println(user.getName() +
                                        "/n/tAge: " + user.getAge() +
                                        "/n/tSex: " + user.getSex());
        }       
    }
}

 這個程式會顯示資料表中的所有資料,並將資料表中的第一筆資料更新,一個執行的結果如下:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, user0_.age as age from USER user0_
caterpillar
   Age: 28
   Sex: M
momor
   Age: 25
   Sex: F
Bush
   Age: 25
   Sex: M
Becky
   Age: 35
   Sex: F
Hibernate: update USER set name=?, sex=?, age=? where user_id=?
Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, user0_.age as age from USER user0_
justin
   Age: 28
   Sex: M
momor
   Age: 25
   Sex: F
Bush
   Age: 25
   Sex: M
Becky
   Age: 35
   Sex: F

 如果您開啟了一個Session,從資料表中取出資料顯示到使用者介面上,之後關閉Session,當使用者在介面上操作完畢並按下儲存時,這時您要重新開啟一個Session,使用update()方法將物件中的資料更新至對應的資料表中,一個例子如下:

HibernateTest.java
import onlyfun.caterpillar.*;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
import java.util.*;

public class HibernateTest {
    public static void main(String[] args) throws HibernateException {
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

        Session session = sessionFactory.openSession();     
        List users = session.find("from User");
        // 關閉這個Session
        session.close();

        User updated = null;
      
        for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
            User user = (User) iterator.next();
            if(updated == null)
                updated = user;
            
            System.out.println(user.getName() +
                                       "/n/tAge: " + user.getAge() +
                                       "/n/tSex: " + user.getSex());
        }
      
        // 使用者作一些操作,之後儲存
        updated.setName("caterpillar");
      
        // 開啟一個新的Session
        session = sessionFactory.openSession();   
        // 更新資料
        session.update(updated);
        users = session.find("from User");      
        session.close();
        sessionFactory.close();

        for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
            User user = (User) iterator.next();            
            System.out.println(user.getName() +
                                       "/n/tAge: " + user.getAge() +
                                       "/n/tSex: " + user.getSex());
        }       
    }
}

 這個程式執行的結果範例如下,您可以看看實際上執行了哪些SQL:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, user0_.age as age from USER user0_
justin
   Age: 28
   Sex: M
momor
   Age: 25
   Sex: F
Bush
   Age: 25
   Sex: M
Becky
   Age: 35

   Sex: F
Hibernate: update USER set name=?, sex=?, age=? where user_id=?
Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, user0_.age as age from USER user0_
caterpillar
   Age: 28
   Sex: M
momor
   Age: 25
   Sex: F
Bush
   Age: 25
   Sex: M
Becky
   Age: 35
   Sex: F

 Hibernate提供了一個saveOrUpdate()方法,為資料的儲存或更新提供了一個統一的操作介面,藉由定義映射文件時,設定<id>標籤的unsaved-value來決定什麼是新的值必需,什麼是已有的值必須更新:

User.hbm.xml
<id name="id" type="string" unsaved-value="null">
    <column name="user_id" sql-type="char(32)" />
    <generator class="uuid.hex"/>
</id>

unsaved-value可以設定的值包括:

  • any - 總是儲存
  • none - 總是更新
  • null - id為null時儲存(預設)
  • valid - id為null或是指定值時儲存

 這樣設定之後,您可以使用session.saveOrUpdate(updated);來取代上一個程式的session.update(updated);方法。

 如果要刪除資料,只要使用delete()方法即可,直接看個例子。

HibernateTest.java
import onlyfun.caterpillar.*;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
import java.util.*;

public class HibernateTest {
    public static void main(String[] args) throws HibernateException {
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

        Session session = sessionFactory.openSession();     
        List users = session.find("from User");
        User updated = null;
      
        for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
            User user = (User) iterator.next();
            if(updated == null)
                updated = user;
            
                System.out.println(user.getName() +
                                            "/n/tAge: " + user.getAge() +
                                             "/n/tSex: " + user.getSex());
       }

        session.delete(updated);
        users = session.find("from User");
        session.close();
        sessionFactory.close();

        for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
            User user = (User) iterator.next();            
            System.out.println(user.getName() +
                                       "/n/tAge: " + user.getAge() +
                                       "/n/tSex: " + user.getSex());
        }       
    }
}

 一個執行的結果範例如下:

log4j:WARN No appenders could be found for logger (net.sf.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, user0_.age as age from USER user0_
justin
   Age: 28
   Sex: M
momor
   Age: 25
   Sex: F
Bush
   Age: 25
   Sex: M
Becky
   Age: 35
   Sex: F
Hibernate: delete from USER where user_id=?
Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, user0_.age as age from USER user0_
momor
   Age: 25
   Sex: F
Bush
   Age: 25
   Sex: M
Becky
   Age: 35
   Sex: F

 Hibernate對於資料的更新、刪除等動作,是依懶id值來判定,如果您已知id值,則可以使用load()方法來載入資料,例如:

User user = (User) session.load(User.class, id);

 更多有關於Hibernate資料更新操作的說明,您可以看看參考手冊的第九章內容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值