Hibernate入门07 - 更新,删除数据

入门 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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值