问题描述
在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的时候肯定报错。