求高手帮我看看这个hibernate的问题啊!

问题描述

在record里面没有设置id的值,因为在数据库里面的自增的!public long insertUser(WebUser record) { Session session=null; long id=0; try{ session=sessionFactory.getCurrentSession(); session.beginTransaction(); session.save(record); id=record.getId(); session.getTransaction().commit(); }catch(HibernateException e){ e.printStackTrace(); }finally{ }return id;}上面这段是可以得到id的,但是我觉得应该是得不到啊!因为我觉得要得到这个应该要先commit之后然后再从数据库里面取出来然后才能得到啊!但是这里为什么能拿到啊!而且上面的程序没session.close,是因为如果关了就会报错,即使在finally里面关都不行,求高手解释哈! 问题补充:jkxydp 写道

解决方案

按常理来说,save时因该是将该插入操作保留在数据库缓存中,只有commit之后,才会真正的执行到数据库中,也就是只有commit之后,才能真正的获取真实ID。不过这里要看一下,你hbm.xml文件中的ID字段的所采用的主键生成方式,Hibernate提供了多种复杂的主键生成支持。如:assigned,hilo,seqilo,incement,identity,native....等等。。
解决方案二:
楼主可以看下save这个方法的源码,自然就知道它干了什么
解决方案三:
肯定使用了hibeinate主键生成策略。看看实体类的配置文件。
解决方案四:
至于lz说没看到hibernate打印出sql语句的情况,那得看看你的hibernate.cfg.xml配置上有没有<property name="show_sql">true</property>,而且一定要是true才会显示。我的意思是:如果record是个瞬时态的对象,那么session.save(record);一定执行插入操作。
解决方案五:
引用public long insertUser(WebUser record) { Session session=null; long id=0; try{ session=sessionFactory.getCurrentSession(); session.beginTransaction(); session.save(record); //这里应该record对象被持久化了,也就是说关联了session,也就是record已经在数据库里有对应的记录了,所以你能下面id=record.getId();取得id的值。 id=record.getId(); session.getTransaction().commit(); }catch(HibernateException e){ e.printStackTrace(); }finally{ } return id; }
解决方案六:
hibernate可以得到这样该ID,原因可以参看persistence with hibernate里面的论述
解决方案七:
hibernate中如果设定id为hibernate自己维护的话是可以得到的
解决方案八:
为什么能取得ID那是因为数据库的隔离级别那块有说明吧
解决方案九:
你看看主键用的是那种生成策略吧, 你换成assigned在试,肯定报错
解决方案十:
在应用程序中获取数据库新生成的主键ID是ORM需要解决的问题之一,Hibernate中获取新生成的主键ID,屏蔽了内部实现细节,获取的策略有多种,可以手动,在JDBC3.0 Statement接口允许我们获得由一个插入操作所创建的新生的主键, 方法Statement.getGeneratedKeys()的详细使用说明可以参考API。
解决方案十一:
是不是因为你的事务自动提交没有设置为false,我在用JDBC的时就遇到过,因为在JDBC中默认的是当你插入数据进入数据库时,它会自动commit,如果不setCommit(false),即使开启了事务,它也不会按你的commit走,因为它自己已经commit了。
解决方案十二:
引用 session.save(record); id=record.getId(); session.getTransaction().commit(); 常理的话,在save时候,hibernate只是保存到缓存中还没真正insert在commit时候,才会执行insert操作。lz你的主键生成机制是什么,是在hibernate里吗,还是数据库里面自动生成的呢。
解决方案十三:
你主意到生成的sql语句了吗?在你插入的时候id也是hibernate插入的,如果你用的是oracle的话用序列生成的id那么你很好理解;如果你用的是mysql你很难理解,这是因为mysql数据库的表主码自增是通过该表本身就有维护了一个generatedValue,hibernate在读配置文件的时候就已经抓取了这个值,而插入的时候hibernate再把它拿出来,初始化id,插入到数据库中。你取的是currentSession,我没猜错的话,你启动了声明式事物管理,或者用了其它的事务管理工具,你拿到当前的session 然后再开启事务有点多余,事务里面开事务小心产生死锁。关闭session是事务管理工具的事情,你在这里关闭了,事务管理工具再关一次,或者再使用这个session的时候肯定报错。

时间: 2024-07-31 09:23:34

求高手帮我看看这个hibernate的问题啊!的相关文章

php字符串转换-php 字符串转换为题,求高手帮看看那里有问题?

问题描述 php 字符串转换为题,求高手帮看看那里有问题? Date.prototype.format = function(format){ var o = { "M+" : this.getMonth()+1, //month "d+" : this.getDate(), //day "h+" : this.getHours(), //hour "m+" : this.getMinutes(), //minute &quo

sql server-SQL Server提示错误,求高手帮解决

问题描述 SQL Server提示错误,求高手帮解决 select gl.ccus_id 客户编码, gl.cexch_name 币种, gl.cbegind_c 金额期初方向, (case when gl.cbegind_c = '借' then SUM(ISNULL(gl.mb, 0)) + SUM(ISNULL(ap.iAmount_f,0)) - SUM(ISNULL(dts.iQuantity * dts.iTaxUnitPrice, 0)) else sum(isnull(-gl.m

跪求高手出现-求高手帮帮忙,不知道该怎样解决

问题描述 求高手帮帮忙,不知道该怎样解决 Exception in thread "main" java.lang.StackOverflowError at java.text.DecimalFormat.subformat(DecimalFormat.java:903) at java.text.DecimalFormat.format(DecimalFormat.java:692) at java.text.DecimalFormat.format(DecimalFormat.j

基础 发散-真心的求高手帮我看看代码,指教下,我很困惑

问题描述 真心的求高手帮我看看代码,指教下,我很困惑 命题:求求1+1/2+1/3+--+1/n的c语言编程 以下是我的代码: #include void main() { float i,j,sum; printf("请输入你想求的位数:n"); scanf("%f",&j); for(i=1;i<=j;i++) { sum+=1/i; } printf("结果为 %fn",sum); } 运行结果不对,但是我觉得思路很清晰,找不

json- 公司给的任务,求高手帮我

问题描述 公司给的任务,求高手帮我 假如有一个json数据接口,例如http://api.esportsmh.com/CourtPoints.aspx?key=itihcxtuxc&a这是一个接口,里面装的是json数据,求怎么让json数据显示出来,静态页面实现出来!jquery+一般处理程序解决 解决方案 我最近也在做这个,但是我不是用jQuery实现的,我是直接用C#获取返回值,然后将返回值处理一下,变成JSON格式,然后再转化为一般对象!供你参考:protected void btnSe

c++-vs2005activex编译后无法生成.ocx文件.求高手帮我看看什么问题.

问题描述 vs2005activex编译后无法生成.ocx文件.求高手帮我看看什么问题. Compiling resources... 1>Compiling manifest to resources... 1>Linking... 1>LINK : C:UsersSWDocumentsVisual Studio 2005ProjectsTest_01DebugTest_01.ocx not found or not built by the last incremental link

delphi 7-Delphi 求高手帮代码改正

问题描述 Delphi 求高手帮代码改正 program Project1; uses Forms, PMain in 'PMain.pas' {FMain}, PStudent in 'PStudent.pas' {FStudent}, DataMdl in 'DataMdl.pas' {DataMdlSystem: TDataModule}, PCourse in 'PCourse.pas' {FCourse}, PCourseAdd in 'PCourseAdd.pas' {FCourse

求高手帮调试下程序,紧急,谢谢

问题描述 我的邮件发送和接收程序,发送成功,接收是登录服务器错误,请高手帮调试下,QQ982337685在线等 解决方案 解决方案二:Code??解决方案三:你给邮箱,我给你代码~~

求高手帮下net framework 4.5.2安装

问题描述 安装老这样,4.5.1也安装不了,求高手!!! 解决方案 解决方案二:贴出日志文件.解决方案三:1.看是否是你系统补丁没有补上打完整?微软很多软件,都是需要在安装国某个补丁的前提下才可以安装的.2.看是否是由于操作系统的windowsupdate临时文件损坏而造成的.可以尝试将SoftwareDistribution文件夹重命名后,再安装试试.不过,你最好还是贴出你的日志,让大家有个参考先.