`
yezi
  • 浏览: 279434 次
  • 来自: 北京
社区版块
存档分类
最新评论

对于saveOrUpdate的正确使用

阅读更多
hibernate提供了saveOrUpdate的方法来进行数据库的操作。对于saveOrUpdate的解析,robbin有很精辟的文章了,这里不再重复,hibernate会根据对象的状态决定是insert还是update,其根本是通过xml文件中unsaved-value来确定的。

如果设置null,系统会根据传入的对象的id的值判断,如果是null,则表示对象不存在,那么insert,如果不是Null,则表示已经存在,那么update

如果设置为none,那么表示对象不存在,会始终调用insert

如果设置为any,那么表示对象始终存在,会始终调用update

了解这些后,在使用的过程中发现了一个问题,现在记录下来。原始目的是向数据库中添加一条数据,应该用到insert,这时在配置文件中定义了null,但是没有象预想的一样,而是抛出了Exception executing batch,发现hibernate的sql用的是update,怎么会这样呢?

最后发现原因处在BeanUtils.copyProperties,我在ftl文件里面定义了一个form,
<@ww.form action="savegroup" method="post">
		<@ww.token />
		<@ww.hidden name="groupModel.id" value=null/>
		<@ww.textfield name="groupModel.name" 
			label="Group Name"
			tooltip="${action.getText('reg.title.note')}"
			required="true" requiredposition="true"/>
		<@ww.textarea name="groupModel.desp" 
			label="Group Description"
			tooltip="${action.getText('reg.username.note')}"
			required="true" requiredposition="true"/>
		<@ww.submit value="${action.getText('reg.submit')}"/>
	</@ww.form>
然后在action里面如下操作:
BeanUtils.copyProperties(groups, groupModel);
问题就来了,当新增一调数据的时候,groupModel.id是空值,但是当BeanUtils.copyProperties后,就将null转换成了"",于是hibernate认为主键不为null,就转换成了update,异常就出来了。去掉form中id,一切正常了。
分享到:
评论

相关推荐

    Hibernate merge、update与saveOrUpdate方法的区别

    ### Hibernate merge、update与saveOrUpdate方法的区别 在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存...正确理解和使用这些方法有助于提高Hibernate应用的开发效率和代码质量。

    save, saveOrUpdate, persist, merge, update 区别.docx

    这些方法各有其特点和适用场景,理解它们的区别对于优化数据库操作至关重要。 1. **save()**: `save()` 方法用于将新实体保存到数据库中。它会为新实体生成一个唯一的标识符(通常是主键)。如描述中提到的,`...

    05_传智播客hibernate教程_实体对象的三种状态与saveOrUpdate方法

    在Java的持久化框架Hibernate中,实体对象的状态管理和`saveOrUpdate`方法是核心概念,对于理解和有效使用Hibernate至关重要。在本教程中,我们将深入探讨实体对象的三种状态以及`saveOrUpdate`方法的工作原理。 ...

    Hibernate save() saveorupdate()的用法第1/2页

    如果用户修改了个人信息并重新提交,则可以使用`saveOrUpdate()`方法来确保信息正确更新或插入。 - **场景2**:假设我们需要处理一个订单系统,在这个系统中,客户可以添加或修改订单详情。在这种情况下,`...

    hibernate常见异常

    * 使用 session.clean(),如果在 clean 操作后面又进行了 saveOrUpdate(object) 等改变数据状态的操作,有可能会报出 "Found two representations of same collection" 异常。 * 使用 session.refresh(object),当 ...

    hibernate常见问题及处理.doc

    - 使用`session.clean()`,这将清理Session中的所有对象,但之后的`saveOrUpdate()`操作可能会导致其他异常。 - 使用`session.refresh(object)`,前提是对象已经存在于数据库中,否则可能会引发错误。 - 推荐使用...

    JAVA三级考试预测题目

    4. XML 处理指令:XML文档中的处理指令(Processing Instruction)使用定界符,选项C正确。其他选项是错误的。 5. Spring 框架描述:Spring框架是一个开源框架,降低了企业应用开发的复杂性,支持使用基本的...

    C# NHibernate 使用

    理解何时使用原生SQL,何时使用HQL(Hibernate Query Language),以及如何正确使用批处理和延迟加载,都是优化性能的关键。 10. **测试与调试** 使用NHibernate进行单元测试是重要的实践。你可以利用Mock对象或In...

    高效使用JavaEE+ORM框架.pdf

    遵循CRUD原则是保证ORM正确使用的有效方法: 1. Create(创建):创建操作应传入非持久化对象,调用create()方法后对象变为持久化。 2. Retrieve(检索):通过ORM检索的对象都是持久化对象,直到事务结束。 3. ...

    NHibernate实例(初级使用者教程demo)

    例如,你可以使用Session的Save或SaveOrUpdate方法保存新实体,QueryOver或Criteria API查询数据,Update或Merge更新现有实体,最后用Delete移除不再需要的记录。 7. **事务(Transactions)**: NHibernate支持事务...

    JAVA错误文档[归纳].pdf

    同时,打印输出时也要注意使用正确的编码。 9. **没有Action映射为命名空间和action名称** 这个错误意味着在Struts配置中未定义指定的命名空间和动作。检查`struts.xml`,确保有匹配的命名空间和动作映射。 对于...

    Hibernate映射导致的几个异常

    此外,注意日期和时间类型的转换,确保使用正确的格式。 7. **`OneToMany`和`ManyToMany`关联问题:** 当处理一对多或多对多关系时,可能会遇到级联操作不当或集合未初始化的问题。正确配置`cascade`属性,如`...

    Hibernate的事务处理机制和flush方法的用法.docx

    在使用Hibernate进行数据库操作时,事务管理和`flush`方法的正确使用至关重要,因为它们直接影响到数据的一致性和安全性。在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些...

    HibernateTemplate的方法使用

    ### HibernateTemplate 的方法使用 #### 一、简介与配置方式 ...然而,正确地理解和使用这些方法对于保证应用程序的性能和可靠性至关重要。希望以上内容能帮助大家更好地掌握 HibernateTemplate 的使用技巧。

    使用Hibernate开发租房系统78.

    使用JUnit和Hibernate Test框架,我们可以对数据访问层的代码进行单元测试,确保其正确性和效率。 总结来说,“使用Hibernate开发租房系统78”涵盖了从对象关系映射、数据库配置、CRUD操作、关联映射、事务管理、...

    hibernate学习教程

    - 避免过多使用Session的saveOrUpdate(),明确区分save()和update()的使用场景。 - 合理利用缓存,降低数据库访问压力。 - 使用HQL或Criteria API而非原生SQL,以保持代码的可移植性。 - 注意事务的正确管理和...

    关于在Hibernate中对于Clob,Blob字段的处理方法

    例如,当你调用`session.saveOrUpdate(entity)`或`entityManager.persist(entity)`时,Hibernate会将Clob和Blob的内容正确地保存到数据库中。 当从数据库中检索这些字段时,同样可以通过Hibernate的API获取。例如,...

    sfs2x中使用hibernate3

    3. 使用Session执行CRUD操作:创建(`save()`, `saveOrUpdate()`)、读取(`get()`, `load()`, `query()`)、更新(`update()`, `merge()`)和删除(`delete()`)数据。 4. 提交事务:由于SFS2X可能会处理大量并发...

    对象状态到管理,很好的word文档

    若对游离态对象进行修改,需要手动使用`merge()`或`saveOrUpdate()`方法将更改同步回数据库。 4. **无名态(Unknown)**: 无名态是一种特殊情况,表示数据库中有记录,但内存中没有对象,同时Session缓存中也不...

    Hibernate对象状态以及各种保存方法的区别

    Hibernate 是一个流行的 Java 开发框架,用于简化数据库操作。它提供了对象关系映射(ORM)功能,使得开发者可以用面向对象的方式...正确使用这些状态和保存方法能够避免数据冗余和丢失,提高应用的性能和数据一致性。

Global site tag (gtag.js) - Google Analytics