0 0

请教hibernate 连续查询问题25

我对一个基表查询
A a=find("hql").get(0);
然后a.setProp(555);
然后对换一个字段查询
B b=find("ohterhql").get(0);
在第一次查询时没问题
在b的find时会将a setProp的值持久化到数据库中
这是为什么
hibernate不熟,请教各位


<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9iDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
</props>

</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>


<!-- 支持 @Transactional 标记 -->
<tx:annotation-driven transaction-manager="transactionManager"
proxy-target-class="true" />

<!-- =========== openSessionInViewInterceptor ==============-->
<bean id="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory" ref="sessionFactory" />
</bean>



hibernate3.2+spring2
2008年6月17日 19:01

3个答案 按时间排序 按投票排序

0 0

采纳的答案

在那个调用了a.setProp(555); 方法的@Transactional(propagation=Propagation.XXXXXX, readOnly=true)

加上readOnly。

因为Hibernate有持久状态和脱管状态,持久状态就是Hibernate 的session.close之前(正确来说,是session flush或commit之前),经session 查询出来的对象都是脱管状态。参照Hibernate的文档:

引用
持久(Persistent) - 持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例可能是刚被保存的,或刚被加载的,无论哪一种,按定义,它存在于相关联的Session作用范围内。 Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,在当前操作单元(unit of work)执行完毕时将对象数据(state)与数据库同步(synchronize)。 开发者不需要手动执行UPDATE。将对象从持久(Persistent)状态变成瞬时(Transient)状态同样也不需要手动执行DELETE语句。


假设
@Transactional(propagation=Propagation.XXXXXX, [color=red]readOnly=true[/color])
public void doSomething(Object a){
  ...
  a.setProp(555);
  ...
}

而调用a.setProp(555)的doSomething方法有@Transactional修饰,表示此方法在spring容器包装上事务,也就是代码进入方法之前,spring会启用事务,退出方法的时候会提交事务(等于是调用了flush或者commit),这时候,虽然你没有显式的保存a,但是还是会被持久化的。发生此方法内发生异常的时候,事务则回滚(不保存)

readOnly则表示,此方法内对持久对象修改不被保存。



2008年6月17日 22:54
0 0

这个问题只能加入事务处理才可以,设置你的这个方法为read-only就不会出现自动提交之前取出数据又赋值的问题了!楼上说的很详细

2008年6月18日 11:08
0 0

情况没错,
建议你在做完a查询,b查询之后再进行对a,b的赋值操作。

参考资料
http://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate.html#objectstate-flushing

session 刷出数据就会保存到数据库,session什么时候刷出

引用

    *

      before some query executions
//在某些查询语句执行之前
    *

      from org.hibernate.Transaction.commit()
    *

      from Session.flush()

The SQL statements are issued in the following order

   1.

      all entity insertions, in the same order the corresponding objects were saved using Session.save()
   2.

      all entity updates
   3.

      all collection deletions
   4.

      all collection element deletions, updates and insertions
   5.

      all collection insertions
   6.

      all entity deletions, in the same order the corresponding objects were deleted using Session.delete()

2008年6月17日 19:09

相关推荐

    Hibernate连表查询 Hibernate连表查询

    根据提供的文件信息,我们可以深入探讨Hibernate中的连表查询方法及其应用。下面将详细介绍与标题、描述及部分代码相关的...需要注意的是,在编写连表查询时要充分考虑性能问题,避免因查询复杂度过高而导致性能瓶颈。

    Hibernate分页查询小结

    Hibernate分页查询小结

    hibernate 模糊查询 分页

    本篇文章将深入探讨如何使用Hibernate实现模糊查询和分页功能,这对于任何需要处理大量数据的应用程序来说都是至关重要的技能。 首先,让我们了解Hibernate的核心概念。Hibernate是一个开源的JPA(Java Persistence...

    hibernate多表联合查询

    Hibernate作为一款流行的Java持久层框架,提供了一种非常便捷的方式来处理这些问题。本文将详细介绍如何利用Hibernate进行多表联合查询,并通过一个具体的例子来展示其强大功能。 #### 二、多表联合查询概述 多表...

    Hibernate分页查询原理解读

    ### Hibernate 分页查询原理详解 #### 一、引言 在大数据量处理场景下,分页查询是提高数据检索效率的重要手段之一。Hibernate作为Java领域内最常用的持久层框架之一,其内置的分页功能非常实用且高效。本文将深入...

    hibernate实现动态SQL查询

    相比静态SQL,动态SQL更加灵活,能够适应复杂多变的查询需求,避免了硬编码SQL带来的问题,如代码冗余、难以维护等。 三、Hibernate中的动态SQL 在Hibernate中,我们通常使用HQL(Hibernate Query Language)或...

    通用的hibernate查询

    【hibernate查询详解】 Hibernate,作为一款强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者使用面向对象的方式来处理数据库,从而避免了传统的JDBC编码方式带来的复杂性。本篇文章将...

    Hibernate_query查询数据表中的一个字段.

    Hibernate提供了一种灵活的查询语言——HQL(Hibernate Query Language),以及 Criteria 查询和 Criteria API,它们都可以用来获取数据表中的特定字段。 二、Hibernate配置 在使用Hibernate进行查询前,首先需要...

    hibernate实现递归查询

    本文将深入探讨如何使用Hibernate实现递归查询,以解决在数据层次结构中涉及父节点与子节点关系时的问题。递归查询通常用于处理树形结构的数据,例如组织结构、菜单系统或者文件目录等。 首先,我们需要了解递归的...

    Hibernate的MySql查询.rar

    本文将深入探讨在使用Hibernate进行MySQL查询时的一些关键知识点,以帮助开发者更好地理解和应用这些技术。 首先,我们需要理解Hibernate的核心概念。Hibernate通过提供一个中间层,将Java对象与数据库表进行映射,...

    hibernate关联查询 实例源码

    hibernate关联查询 实例源码 java web 如果不明白hibernate关联查询不明白的可以看看,保证马上学会,注释,数据库都有,很简单易学的源码,谢谢下载!

    hibernate自定义查询

    在Hibernate中,自定义查询是扩展其功能的重要方式,能够帮助我们实现更复杂的数据库交互需求。本文将深入探讨Hibernate自定义查询的相关知识点。 一、Hibernate HQL查询 Hibernate Query Language (HQL) 是...

    hibernate子查询

    在使用Hibernate进行数据查询时,有时会遇到需要使用子查询的情况。然而,正如你所描述的,Hibernate的HQL(Hibernate Query Language)并不直接支持在`FROM`子句后跟一个子查询,这与标准的SQL语法有所差异。在HQL...

    hibernate 级联查询

    “Hibernate 级联查询”是指在使用Hibernate这个Java持久化框架时,如何处理对象之间的关联查询。Hibernate提供了级联操作来简化数据的保存、更新和删除等操作,使得开发者无需手动编写复杂的SQL语句,就能实现关联...

    Hibernate中查询语句

    Hibernate中的查询方法若HQL,详细讲解HQL与使用的具体例子

    Hibernate查询练习小例子

    利用MYSQL数据库提供的样例数据库world建立的查询小例子。已经建立好了数据库对应的...本项目主要是为了练习使用Hibernate查询数据库。如果有什么问题可以发站内信或者邮件asddf14@hotmail.com。我会尽量解答一下~~~

    hibernate查询代码

    最后,`hibernate查询`这个压缩包可能包含了一些示例代码和配置文件,用于演示如何在Java项目中实现上述查询方式。通过分析这些文件,你可以更好地理解Hibernate查询的工作原理,并将其应用到自己的项目中。 总之,...

    关于Hibernate3中文查询出错问题的解决

    在使用Hibernate3进行数据库操作时,中文查询出错是一个常见的问题,这主要涉及到字符编码、数据库配置以及Hibernate的设置等多个方面。以下将详细介绍如何解决这个问题。 首先,我们要明白错误的根源通常在于字符...

    struts+hibernate查询所有记录

    ### Struts+Hibernate查询所有记录 #### 一、概述 在Java Web开发中,Struts与Hibernate是非常流行的框架组合,用于构建复杂的企业级应用。本文将详细介绍如何利用Struts和Hibernate来实现对Oracle数据库中所有...

Global site tag (gtag.js) - Google Analytics