请教hibernate 连续查询问题

问题描述

我对一个基表查询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

解决方案

在那个调用了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则表示,此方法内对持久对象修改不被保存。
解决方案二:
这个问题只能加入事务处理才可以,设置你的这个方法为read-only就不会出现自动提交之前取出数据又赋值的问题了!楼上说的很详细
解决方案三:
情况没错,建议你在做完a查询,b查询之后再进行对a,b的赋值操作。参考资料http://www.hibernate.org/hib_docs/v3/reference/en/html/objectstate.html#objectstate-flushingsession 刷出数据就会保存到数据库,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()

时间: 2024-09-23 01:20:41

请教hibernate 连续查询问题的相关文章

请教Hibernate支持正则查询

问题描述 各位过客,请花您一点的时间帮我解决一个hibernate正则查询的问题,比如我用hql查询语句这样实现select*fromt_userwherenameregexp'abc'的sql语句.请各位不吝指教,小弟先谢谢了. 解决方案 解决方案二:关注中

hibernate模糊查询条件是中文 但是不能返回值

问题描述 小弟请教一下:我用的hibernate模糊查询页面的数据是utf-8,数据库也是模糊查询的条件是中文他就是返回为空但是是数字他又正确了我保证hql语句正确的用的是SSHspring我配置了characterEncoding=UTF-8请大家赐教 解决方案 解决方案二:你首先要看看不的数据库的中文是否是乱码,是的话那就不能查询出来,数字又正确,说明你的查询语句没错,仔细看下解决方案三:数据库不是乱码,数据是正确的查询语句如下:fromDepartmentdmwheredm.departm

用hibernate连续保存一个实体对象时报错

问题描述 高手们:您们好,请教您们个问题,我在用hibernate连续(一个循环)保存数据,报adifferentobjectwiththesameidentifiervaluewasalreadyassociatedwiththesession我在网上也搜索了解决方法,我也是用了meger,但是不管用,请高手们指点下了哦.org.springframework.orm.hibernate3.HibernateSystemException:adifferentobjectwiththesame

Hibernate属性查询简介

本文向大家介绍Hibernate属性查询,可能好多人还不了解Hibernate属性查询,没有关系,看完本文 你肯定有不少收获,希望本文能教会你更多东西. 今天说一下Hibernate属性查询:使用HQL的时候并不是把 hbm.xml 里面的所有属性取出来,只取出有 用的属性便可以了,举个例子: List list =session.createQuery ("select user.name,user.age from TUSER user").list(); Iterator it

spring-新手关于Spring管理Hibernate下查询性能的疑问

问题描述 新手关于Spring管理Hibernate下查询性能的疑问 我这么两段代码: 1.Query query = Dao.createQuery("from table"); list = query.list(); for(Table item : list){ Query query2 = Dao2.createQuery("select id from table2"); list = query2.list(); } 2.Query query = D

java-Java Hibernate中查询取值

问题描述 Java Hibernate中查询取值 Sql语法是这样的:![图片说明] 用Hibernate查询的语法不知道有没有问题呢? 还有最后一个问题: 我查询后的值存在query里面了, 我又要怎么取值呢? 求大家帮帮忙 解决方案 你那ID写里面就是死值了,要么用"?"代替,要么用 "+ +" 抱起来,哪有你那么写的 解决方案二: query.list()吧,然后看返回值是什么类型就用什么类型去接收就OK了.推荐看看这个先,里面有你想要的内容:http://z

hibernate hql查询问题

问题描述 hibernate hql查询问题 遇到个hibernate hql查询的问题,求高手解答 实体类A包含实体类T属性,实体类T有两个子类T1,T2,代码如下: A{ T t; } T{ } T1 extends T{ } T2 extends T{ } 现在我要查询A,条件是T为T2的类型,HQL语句应该怎么写? 解决方案 除了Java类与属性的名称外,查询语句对大小写并不敏感. 所以 SeLeCT 与 sELEct 以及 SELECT 是相同的,但是 org.hibernate.eg

poi3 8大数据导出-poi3.8大数据量Excel导出连续查询导出不同的报表后导出速度非常慢

问题描述 poi3.8大数据量Excel导出连续查询导出不同的报表后导出速度非常慢 poi3.8用((SXSSFSheet)sheet).flushRows()方法解决了大数据量的excel导出,但是我在使用过程中,由于每个单元格都要设置不同的颜色和数据格式,发现导出第一张报表时速度还勉强可以接受,但是继续导出另一张报表,速度就慢的跟蜗牛似的,要10分钟甚至3个小时,请问有什么方法可以解决? 代码如下: private static void fillExcel(KDTable kdtRepor

hibernate 级联查询

hibernate级联查询 1,实体类结构 Java代码   @Entity   @Table(name = "t_vote")   public class Vote {       private int id;       /***       * 1:最宜居<br>       * 2:最优户<br>       * 3:最佳物业       */       private int type;       private HouseBuilding h