Hibernate入门

来源:互联网 发布:筑龙投标软件 编辑:程序博客网 时间:2024/05/01 06:24
 如果您是在同一个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资料更新操作的说明,您可以看看参考手册的第九章内容。
原创粉丝点击