hibernate3学习笔记(五)saveOrUpdate方法

还是参考前面的例子:http://blog.csdn.net/kunshan_shenbin/archive/2008/09/02/2864883.aspx

修改User.hbm.xml文件如下:

<!DOCTYPE hibernate-mapping PUBLIC

“-//Hibernate/Hibernate Mapping DTD 3.0//EN”

“http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>

<class name="com.hb3.pack_01.model.User" table="user"

dynamic-insert=”true”

dynamic-update=”true”

>

测试代码:

package com.hb3.pack_01;

import java.util.Iterator;

import java.util.List;

import org.hibernate.Criteria;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

import com.hb3.pack_01.model.User;

public class BusinessService {

public static void main(String[] args) {

Configuration config = new Configuration().configure();

SessionFactory sessionFactory = config.buildSessionFactory();

Session session = sessionFactory.openSession();

Criteria criteria = session.createCriteria(User.class);

List users = criteria.list();

Iterator iterator = users.iterator();

System.out.println(“id /t name/age”);

while (iterator.hasNext()) {

User user = (User) iterator.next();

System.out.println(user.getId() + ” /t ” + user.getName() + “/” + user.getAge());

}

session.close();

System.out.println(“========================================”);

session = sessionFactory.openSession();

User user = new User();

user.setId(2);

user.setName(“chenyan”);

user.setAge(new Integer(24));

Transaction tx = session.beginTransaction();

session.saveOrUpdate(user);

tx.commit();

System.out.println(“========================================”);

user = new User();

user.setName(“yangye”);

user.setAge(new Integer(23));

tx = session.beginTransaction();

session.saveOrUpdate(user);

tx.commit();

System.out.println(“========================================”);

Query query = session.createQuery(“from User”);

users = query.list();

iterator = users.iterator();

System.out.println(“id /t name/age”);

while (iterator.hasNext()) {

user = (User) iterator.next();

System.out.println(user.getId() + ” /t ” + user.getName() + “/” + user.getAge());

}

session.close();

sessionFactory.close();

}

}

运行结果:

13:45:00,140 WARN ConfigurationFactory:127 – No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the classpath: jar:file:/D:/Java/MyEclipse%206.0/workspace/hb3demo/ehcache-1.2.3.jar!/ehcache-failsafe.xml13:45:00,703 WARN EhCacheProvider:93 – Could not find configuration [org.hibernate.cache.UpdateTimestampsCache]; using defaults.13:45:00,734 WARN EhCacheProvider:93 – Could not find configuration [org.hibernate.cache.StandardQueryCache]; using defaults.Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from user this_id name/age1 shenbin/282 chenyan/25========================================Hibernate: update user set name=?, age=? where id=?========================================Hibernate: insert into user (name, age) values (?, ?)========================================Hibernate: select user0_.id as id0_, user0_.name as name0_, user0_.age as age0_ from user user0_id name/age1 shenbin/282 chenyan/243 yangye/23

提示:

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

any:总是存储

none:总是更新

null:id为null时存储(默认)

valid:id为null或是指定值时存储

值得一提的是:

正如上面的代码所示,使用查询语句查出对象后,不能使用同一个session直接对对象进行修改操作。否则会抛出异常:

Exception in thread “main” org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.hb3.pack_01.model.User#2]

……

当然这并不是saveOrUpdate方法独有的。save和update等方法使用不当也会出现如上异常。

解决方法可新建session, 或参阅:

http://www.blogjava.net/Unmi/archive/2007/08/10/135771.html

http://blog.csdn.net/tmpfree/archive/2006/03/13/623516.aspx

http://www.javaeye.com/topic/11581

一路走来,我们无法猜测将是迎接什么样的风景,

hibernate3学习笔记(五)saveOrUpdate方法

相关文章:

你感兴趣的文章:

标签云: