`

Spring+Hibernate的saveOrUpdate问题

阅读更多
1.Spring+Hibernate的saveOrUpdate问题 Copy to clipboard
Posted by: LostParadise
Posted on: 2005-06-01 17:06

环境:Spring1.2,Hibernate3.0.5

测试不通过的Test case:
public class ProductDaoImplTest extends MDTDAOBaseTestCase {
  public void testCreateOrUpdateProduct() {
    ProductDAO dao = (ProductDAO) applicationContext.getBean("productDAO");
    Product product = createNewProduct();
    product.setId("654321");
    dao.createOrUpdateProduct(product);
    setComplete();
  }

  public Product createNewProduct() {
    Product vo = new Product();
    vo.setComments("test");
    vo.setCreationTime(new Date());
    vo.setLastUpdateByUser("TestCase");
    vo.setLastUpdatedTime(new Date());
    vo.setMediaAvailable(new Integer(1));
    vo.setStatus(new Integer(1));
    vo.setVendorProductID("dgdgfegsfd");
    vo.setVendorCode("TS");
    vo.setUpc("hssrerew");
    return vo;
  }
}

对应的DAO:
public class ProductDAOImpl extends
    org.springframework.orm.hibernate3.support.HibernateDaoSupport
    implements ProductDAO {
  public void createProduct(Product product) {
    getHibernateTemplate().save(product);
  }

  public void createOrUpdateProduct(Product product) {
    getHibernateTemplate().saveOrUpdate(product);
  }
}

说明:update,save等测试过都没有问题的,就是saveOrUpdate有问题,不知道是Spring的问题还是Hibernate的问题。而且在Test case那里只要把dao.createOrUpdateProduct(product);改为dao.createProduct(product);得到正确的结果。我查看错误信息,发现saveOrUpdate一直使用update语句而不是insert(在我的测试里面应该使用insert的)。
由于我对Spring+Hibernate还不是很熟悉,不知道各位碰到到类似的情况或者知道解决方案吗?多谢先!

2.Re:Spring+Hibernate的saveOrUpdate问题 [Re: LostParadise] Copy to clipboard
Posted by: jianhua23
Posted on: 2005-06-02 09:20

你已经setId()了,那当然saveOrUpdate会产生相应的update sql语句咯,把setId()去掉,就可以了。
当然你要使用saveOrUpdate的update方法时,必须提供唯一标识符(ID),这样hibernate才能定位数据,进行相应的update操作。

3.Re:Spring+Hibernate的saveOrUpdate问题 [Re: LostParadise] Copy to clipboard
Posted by: LostParadise
Posted on: 2005-06-02 12:25

可能不是这个原因,我研究Spring的sample,发现他用的是merge,我试用这个,的确可以(同样我也用了setID的,因为我的ID是策略是assign的)。就是不知道saveOrUpdate为什么不可用,另外merge和saveOrUpdate有什么区别吗?

4.Re:Spring+Hibernate的saveOrUpdate问题 [Re: LostParadise] Copy to clipboard
Posted by: jianhua23
Posted on: 2005-06-02 14:11

你改一下Hibernate的*.hbm.xml中ID的设置,改成unsave-value="0",然后再试一下,应该可以的。

关于unsave-value的意义你可以参看Hibernate的Reference,我在这里就不多罗嗦了。

5.Re:Spring+Hibernate的saveOrUpdate问题 [Re: jianhua23] Copy to clipboard
Posted by: think
Posted on: 2005-06-02 17:41

对于assigned Id,unsaved-value是没有意义的,可以使用Interceptor.isUnsaved()来区分,对于版本化的PO也可以使用版本区分。
否则的话,saveOrUpdate()方法无法正确区分save or update。

这是2.x的行为;3.x的发生了变化,unsaved-value已不需要,好像不应该出问题的。

6.Re:Spring+Hibernate的saveOrUpdate问题 [Re: LostParadise] Copy to clipboard
Posted by: LostParadise
Posted on: 2005-06-03 09:53

嗯,我测试了一下,改成unsave-value="0"后还是有这个问题。

7.Re:Spring+Hibernate的saveOrUpdate问题 [Re: LostParadise] Copy to clipboard
Posted by: jigsaw
Posted on: 2005-06-03 14:31

我什么都不懂。。。不过这段抄自refrence里面的话对你可能有点用。。

10.7. Automatic state detection

The usage and semantics of saveOrUpdate() seems to be confusing for new users. Firstly, so long as you are not trying to use instances from one session in another new session, you should not need to use update(), saveOrUpdate(), or merge(). Some whole applications will never use either of these methods.

Usually update() or saveOrUpdate() are used in the following scenario:

the application loads an object in the first session

the object is passed up to the UI tier

some modifications are made to the object

the object is passed back down to the business logic tier

the application persists these modifications by calling update() in a second session

saveOrUpdate() does the following:

if the object is already persistent in this session, do nothing

if another object associated with the session has the same identifier, throw an exception

if the object has no identifier property, save() it

if the object's identifier has the value assigned to a newly instantiated object, save() it

if the object is versioned (by a <version></version>or <timestamp></timestamp>), and the version property value is the same value assigned to a newly instantiated object, save() it

otherwise update() the object

and merge() is very different:

if there is a persistent instance with the same identifier currently associated with the session, copy the state of the given object onto the persistent instance

if there is no persistent instance currently associated with the session, try to load it from the database, or create a new persistent instance

the persistent instance is returned

the given instance does not become associated with the session, it remains detached

8.Re:Spring+Hibernate的saveOrUpdate问题 [Re: LostParadise] Copy to clipboard
Posted by: LostParadise
Posted on: 2005-06-03 15:35

if the object's identifier has the value assigned to a newly instantiated object, save() it.这句有点不好理解。恰好就是我的问题所在。
分享到:
评论

相关推荐

    spring+hibernate整合实现简单数据库添加记录

    在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别在应用层和数据持久化层发挥着关键作用。Spring是一个全面的Java企业级应用开发框架,而Hibernate则是一个优秀的对象关系映射(ORM)工具,它简化了...

    spring+struts2+hibernate 增删改查

    例如,我们可以通过Hibernate的Session接口来执行CRUD操作:创建(save或saveOrUpdate)、读取(get或load)、更新(update或merge)和删除(delete)。 具体到增删改查的实现: 1. **增加**(Create):当用户...

    spring+hibernate CRUD 简单示例

    在IT行业中,Spring和Hibernate是两个非常重要的框架,它们分别专注于IoC(Inversion of Control,控制反转)和ORM(Object-Relational Mapping,对象关系映射)。本示例是关于如何将这两个框架集成在一起,实现...

    spring+hibernate+struts框架注册

    在IT行业中,Spring、Hibernate和Struts是三个非常重要的开源框架,它们分别专注于不同层面的软件开发。Spring是一个全面的后端应用框架,提供依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented...

    Spring+Hibernate处理Oracle lob字段(一)

    在本文中,我们将深入探讨如何在Java环境下,利用Spring和Hibernate框架处理Oracle数据库中的LOB(Large Object)字段。LOB字段通常用于存储大体积的数据,如文本、图片或视频。在实际开发中,处理这类数据时可能会...

    struts2+spring+hibernate

    ### Struts2 + Spring + Hibernate 实现数据增删改查详解 #### 一、概述 在Web开发领域,Struts2、Spring与Hibernate是三种非常流行的技术,它们常常被组合在一起形成一个强大的开发框架,简称“SSH”(Struts2 + ...

    struts+spring+hibernate面试题

    在Java Web开发中,Struts、Spring和Hibernate是最常见的三大框架,它们...以上就是关于Struts、Spring和Hibernate面试题的详细解析,涵盖了这三大框架的关键概念和使用技巧,对于理解和解答相关面试问题非常有帮助。

    Struts+Spring+Hibernate实现的增删查该Demo(不带jar包)

    在CRUD操作中,Hibernate提供了Session接口,用于与数据库进行交互,例如保存(save或saveOrUpdate)、加载(load或get)、更新(update)和删除(delete)对象。 在整合这三个框架时,通常会使用Spring的...

    springMVC+spring+hibernate基于的注解整合

    在IT行业中,Spring MVC、Spring和Hibernate是三个非常重要的开源框架,它们分别负责Web应用程序的模型-视图-控制器(MVC)架构、依赖注入(DI)与面向切面编程(AOP)、以及对象关系映射(ORM)。将这三个框架进行...

    struts+spring+hibernate面试题.doc

    标题和描述指向的是一个关于Struts、Spring和Hibernate技术栈的面试题集合,这份文档旨在帮助准备面试的软件工程师理解并复习这些关键技术点。以下是基于给定内容的关键知识点的详细阐述: ### 1. Action的线程安全...

    Spring+Hibernate 增删改查等基本操作

    在IT行业中,Spring和Hibernate是两个非常重要的框架,它们在企业级应用开发中扮演着核心角色。Spring是一个全面的Java应用程序框架,它提供了一个用于管理对象依赖关系的容器,简化了编程模型,而Hibernate则是一个...

    struts+spring+hibernate笔试题

    ### Struts + Spring + Hibernate 笔试题解析 #### 一、Struts 流程与特性 **Struts1 的流程:** 1. **初始化:** 首先加载配置文件 `struts-config.xml`,创建核心控制器 `ActionServlet`。 2. **请求处理:** ...

    收集的struts+spring+hibernate面试题.doc

    ### Struts + Spring + Hibernate 面试题解析 #### 1. AOP 和 IOC 的概念以及在 Spring 中...以上内容涵盖了 Struts、Spring 和 Hibernate 的基础知识及面试常见问题解答,希望能够帮助读者更好地理解和掌握这些技术。

    收集的struts+spring+hibernate面试题借鉴.pdf

    9. Hibernate的`update()`和`saveOrUpdate()`方法:`update()`用于更新已存在的实体,而`saveOrUpdate()`根据对象状态判断是保存还是更新。如果对象有持久化标识且未持久化,或者具有版本信息表明是新实例,它会调用...

    Spring mvc+hibernate例子(包括登录、增删改查等简单功能)

    **Spring MVC + Hibernate 整合应用详解** Spring MVC 和 Hibernate 是两种非常流行的开源框架,它们在 Java Web 开发中有着广泛的应用。Spring MVC 作为 Spring 框架的一部分,负责处理 Web 请求,提供模型-视图-...

    spring+struts+Hibernate面试题

    ### Spring + Struts + Hibernate 面试题解析 #### 一、Struts 相关面试题 **1. Action 是否是线程安全的?如果不是,有什么方式可以保证 Action 的线程安全?如果是,请说明原因** - **Struts 1 中 Action 的...

    Spring+Hibernate一对多关联映射---部门与员工表的级联添加

    在Java企业级开发中,Spring和Hibernate是两个非常重要的框架,Spring主要用于依赖注入和管理对象,而Hibernate则是一个优秀的持久层框架,它简化了数据库操作。本教程将深入探讨Spring和Hibernate结合使用时的一对...

    Hibernate+Spring+Struts2+ExtJS整合开发实例

    Struts2 Action根据请求参数找到对应的实体,更新其属性,然后调用Hibernate的Session.saveOrUpdate()方法保存更改。 4. **删除(Delete)**: 用户选择要删除的记录,发送请求到服务器。Struts2 Action根据ID查找...

    SpringTeamCRUD:Spring+HibernateCRUD

    这个过程通常涉及对象的持久化,即调用Hibernate的save()或saveOrUpdate()方法。 2. 读取(Read):根据ID或其他条件查询数据,通常使用Session的get()或load(),或者Criteria或HQL语句来实现。 3. 更新(Update):...

    struts2+hibernate增删改查+分页

    例如,使用`save()`或`saveOrUpdate()`添加数据,`update()`更新,`delete()`删除,`load()`或`get()`查询。 - **HQL**:Hibernate提供了一种面向对象的查询语言HQL,类似于SQL,但操作的是对象而非表。 3. **结合...

Global site tag (gtag.js) - Google Analytics