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

2019-03-25 13:33|来源: 网路

在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 写道
你主意到生成的sql语句了吗?
在你插入的时候id也是hibernate插入的,如果你用的是oracle的话用序列生成的id那么你很好理解;
如果你用的是mysql你很难理解,这是因为mysql数据库的表主码自增是通过该表本身就有维护了一个generatedValue,hibernate在读配置文件的时候就已经抓取了这个值,而插入的时候hibernate再把它拿出来,初始化id,插入到数据库中。

你取的是currentSession,我没猜错的话,你启动了声明式事物管理,或者用了其它的事务管理工具,你拿到当前的session 然后再开启事务有点多余,事务里面开事务小心产生死锁。
关闭session是事务管理工具的事情,你在这里关闭了,事务管理工具再关一次,或者再使用这个session的时候肯定报错。
session.close问题我已经知道怎么回事了,谢谢,但是为什么能取到ID还是不知道啊! 插入语句里面我看了没出现插入id啊!

问题补充:
caizi12 写道
引用
  session.save(record);
    id=record.getId();
    session.getTransaction().commit();
常理的话,在save时候,hibernate只是保存到缓存中还没真正insert
在commit时候,才会执行insert操作。

lz你的主键生成机制是什么,是在hibernate里吗,还是数据库里面自动生成的呢。

是啊!我正是纠结这个问题啊!save的时候还没执行insert啊!怎么就能直接取出来ID了啊!我的id生成机制是在表里面自增,我用的是mysql,求高手告知为什么能取到啊!

相关问答

更多
  • 1.组装电脑。打开电脑主机箱,先安装电源。然后安装主板挡板,然后安装主板,固定主板(上螺钉)接着安装CPU,CPU风扇。内存条,硬盘。DVD光驱。最后连接各种数据线与电线,键盘鼠标。 2.安装系统。打开电脑,进入BIOS设置,进入BOOT设置。把DVD设置被第一启动,硬盘设置被第二启动。F10保存重启电脑。然后进入PQ进行硬盘分区,把要安装系统的分区设置为活动。重启计算机,在光盘上直接运行把XP系统安装到C盘上,等待安装完系统。 3:主流硬件报价。 中低端主板(华硕 技嘉 冠盟 精英 梅捷)350左右 3代 ...
  • 培训这种东西嘛,为了不让快进可能就是这个视频没有采用流媒体技术处理,所以不存在断点不能快进,是故意而为吧
  • 网站高手还谈不上啊,呵呵、不过可以教教你如何建站 尽量详细跟你说说建站的步骤,只是建一个网站需要理论知识外更多的还是自己操作熟练,你可以参考一下,大体说一下建站的步骤: 注册域名: 域名注册很简单的,1.登陆一个网站 http://www.yan-er.com/leixinxin,注册一个用户名. 2.登陆这个用户名 3.查询你要注册对域名是否被人注册。如果被人注册另外起一个 4.如果你想注册域名没有被人注册。你就可以进行注册了 5.填写一个域名注册表单。表单提交后你的域名还没有生效。只是提交一个订单.交费 ...
  • 精通struts 深入浅出hibernate spring开发 指南 或者 struts in action 精通hibernate spring in action 先用struts,再加上hibernate, 然后自己弄一弄hibernate+Spring(注意lazy load) 在按照这些 书上的内容把这些东西合起来。。。 自己试试就行了,不是很推荐自己也用这个。。 推荐用 springside和appfuse,这两个 框架都是很多好的框架的集合体,前一个是国人自己做的。后一个在sun的 开发社区里 ...
  • 一般的步骤是下载适当的发行版镜像,校验哈希值,然后写入到U盘(刻盘也可以)。启动之后进入Live界面进行试用,这个Live界面不同于Windows PE,它是全功能的。用自带分区工具(比如gparted,可以在终端运行)调整分区,腾出适当空间给Linux。然后不要使用安装程序默认分区设置,将根文件夹挂载到新建的Linux分区,按照提示进行即可。
  • 录制HLTV Demos HLTV demo文件和普通的Half-Life游戏录像差不多,但是你可以选择任意的视角和视点以及跟随的玩家。回放一个HLTV demo的时候并不需要HLTV服务器,只要启动Half-Life并且在控制台输入" playdemo (demo name)"或者"viewdemo (demoname)"就可以了。录制一个HLTV demo,需要将HLTV代理连入游戏server,并且在控制台输入: >record (name) 发出这一命令后,所有的游戏数据将被录制下来,demo文件会 ...
  • 个人推荐入门C语言或者python : C语言语法简单,有良好的逻辑抽象,入门的话还是先面向过程吧,不要刚学就面向对象云里雾里的,如果是要更全面、深入的学习语言本身就C. python语法更加简单简洁易学,而且有各种强大的库,扩展库,可过程可对象,如果是为了通过编程这一手段来迅速的做出有用、实用的程序和界面可以学python. 入门是从Basic语言开始的,大概熟悉程序的基础语法与逻辑后,进阶C语言。 现代很多语言都是从C语言发展而来的,所以可以以C语言做跳板进阶其他面向对象的高级语言。 慢慢接触C++,或 ...
  • 0-100之间的整数^([0-9]|([1-9][0-9])|100)$1-99之间的整数^([1-9]|([1-9][0-9]))$
  • 用CSS和XSL格式的XML