关于hibernate 事务提交的问题

问题描述

近期做项目,遇到了一个问题,用hibernate做数据持久化,可是有的业务逻辑要求是这样的,三张表是独立的。如何将三张表的增删改放到一个事务里面?比如:我先保存一个新的人员信息。然后再查询出保存完之后的人员信息同时要update另外一张表里面。问题就是:session.save(obj) 之后再查询的话。这个对象还是游离状态。会查询不到。所以就不能后面的update操作 问题补充:fmjsjx 写道

解决方案

引用session.save() 一个对象的时候,没有commit() 事务 可以查到这个对象生成的ID 吗? >>:可以, see:Session s = openSession();Transaction tx = s.beginTransaction();int testLength = 3;Long lastId = null;for (int i = 0; i < testLength ; i++) {Car car = new Car();car.setColor( "color " + i );s.save( car );lastId = car.getId();}引用你好!persist 用这个方法 先保存新对象,然后再 用getter 能得到新生成的这个对象ID 么? >>:可以, see:Session s = openSession();Transaction tx = s.beginTransaction();Radio radio = new Radio();radio.setFrequency("32 MHz");s.persist(radio);assertEquals( new Integer(1), radio.getId() );radio = new Radio();radio.setFrequency("32 MHz");s.persist(radio);assertEquals( new Integer(2), radio.getId() );tx.commit();s.close();
解决方案二:
首先,先说一下主键ID的生成跟事务的关系,就是主键ID是不在事务里面的(除非你自己设置其值),如果添加一个对像,但没有提交事务,这个对像的ID是会有值的,然后你又回滚了事务,这时你再次查这个主键ID的下一个值(比如MYSQL的AUTO或ORACLE的SEQUENCE)已经发生变化了,也就是说这个主键ID下次生成的值并不会是你回滚前的值了。因此,你在保存一个未提交的对像后,是可以拿到他的ID给下一次操作使用的,如果在这一系列操作中回滚了事务,那主键ID是以最新值开始(也就是中间跳空了很多,并不连续了)。
解决方案三:
trans = session.beginTransaction(); //开始事务 session.save(a); b.setParentId(a.getId);session.save(b);c.setParentId(b.getId);session.save(c);trans.commit();
解决方案四:
引用session.save() 一个对象的时候,没有commit() 事务 可以查到这个对象生成的ID 吗? 可以的。
解决方案五:
引用你好,session.save() 一个对象的时候,没有commit() 事务 可以查到这个对象生成的ID 吗?可能我上面的问题 没有描述清楚。谢谢我记得是可以的,不过这种其实不用再问了,自己测试一下不就行了……
解决方案六:
首先你的那个对象是个新的对象是临时对象,然后你要吧这个对象update到另外一个表中,那个表中应该就是有这个数据的他是持久状态的。反正我是晕了。你要是说保存这个对象的同时要拿到这个对象所生成的Id,然后在插入到另外一张表的话,你可以直接使用的保存的那个对象就可以getter他生成的Id了。建议在事务中使用persist来实现持久化别用save。
解决方案七:
在同一个session里怎么会查询不到呢trans = session.beginTransaction(); //开始事务session.save(t);Query query = session.createQuery(hql);trans.commit(); //提交事务
解决方案八:
……session.save(obj)之后根本不用查询,传入的obj本身就是托管状态了,可以直接用。

时间: 2024-09-17 17:59:27

关于hibernate 事务提交的问题的相关文章

spring问题,事务提交阶段显示主键ID为0,插入数据库失败

问题描述 spring问题,事务提交阶段显示主键ID为0,插入数据库失败 struts2+hibernate4创建了一个注册系统,本来没问题的,但是整合加入spring之后在注册报空指针异常,在事务提交阶段取到的userId为0.感觉就是在new user()那里出问题,但是一直找不到问题根源困扰好久,*.hbm.xml,实体类都没问题,就是事务提交主键ID老是提示为0,怎么解决 实体类文件package com.chengji.ssh.beans; public class User { pr

hibernate事务开启不成功的错误

问题描述 hibernate事务开启不成功的错误 package cn.jbit.test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.

CGLIB实现的一个hibernate事务管理代理类出现的问题,以及一些疑问

问题描述 先声明下,本人系菜鸟一个,问的问题如果类似于1+1为什么等于2,请少拍板这2天在学习CGLIB,一时兴起用CGLIB实现了一个管理hibernate事务的类.代码如下:package com.test;import java.lang.reflect.Method;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.hibernate.Hibernat

请教一个关于事务提交,提示session is close 的问题

问题描述 问题如题,以下是错误信息,lazy都试过了,还是同样测错误,当事务提交的时候就会报错sessionisclose困扰很久,求大神帮忙myeclipse+webwork+hibernate+oracle10g+webservice集群org.hibernate.SessionException:Sessionisclosedatorg.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:126)atorg.hibernate.tr

Spring声明式事务管理源码解读之事务提交

在下面的文章中,我讲会多次提到第一篇文章,第一篇文章是:Spring声明式事务管 理源码解读之事务开始 如果要理解事务提交的话,理解事务开始是一个前提条件,所以请先看第一篇文章,再 来看这篇 如果你仔细看下去,我想肯定是有很多收获,因为我们确实能从spring的代码和思想 中学到很多东西. 正文: 其实俺的感觉就是事务提交要比事务开始复杂,看事务是否提交我们还是要回到 TransactionInterceptor类的invoke方法 Java代码 public Object invoke(Met

struts2-spring配置方式管理hibernate事务的情况下,每过一段时间产生的错误

问题描述 spring配置方式管理hibernate事务的情况下,每过一段时间产生的错误 项目的背景是struts2+spring+hibernate3 weblogic服务器集群环境 数据库oracle spring管理hibernate 采用配置的方式,配置在了service层. 数据库连接方面使用了hibernate自带的连接池(用其他第三方连接池也试了,问题依旧) 现象:每过一段时间便会报错:(部分) jdbc rollback failed ... TransactionExcepti

NHibernate事务提交时报错,求救!

问题描述 NHibernate事务提交时报错对oracle数据库查询没问题,增删改的时候偶尔会报错"CouldnotopenHibernateSessionfortransaction"java我知道可以设置自动重连,可是NET怎么搞?

[MySQL源码] 在复制线程事务提交与更新relay-log.info之间crash导致的复制不一致

--------------- 最近发现一种情况,在xid event和flush_relay_log_info中间crash,可能会导致数据不一致. 即事务提交了,但relay-log.info文件还没更新,这会造成重启crash recovery后事务被重复执行一次. 幸好,在innodb层记录了这些信息.并且Percona也提供了一个选项来利用这些信息. 1.相关全局变量 在trx/trx0sys.c文件中定义了如下变量 最后一个commit的事务的slave信息: trx_sys_mys

ssh2整合事务提交问题?

问题描述 我再ssh2整合的时候,将hibernate的配置文件交给spring管理,在spring中没写事务,做了一个简单的添加,为什么数据库中会有数据?而将hibernate的配置文件单独管理,则添加的时候数据库没有数据,请问这是为什么? 解决方案 貌似我以前遇到过这个问题.根据我的印象貌似好像是因为,1.hibernate的配置文件交给spring管理,数据源由spring来创建,事务默认是提交的.2.如果单独把数据源配置写在hibernate的配置文件中事务貌似不会自动提交,你试一下在h