浏览 5469 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-10
Hibernate exposes database identity to the application in two ways(Hibernate的API提供了两种方法来获得数据库ID): ■ The value of the identifier property of a persistent instance (通过处于持久太对象的getId方法) ■ The value returned by Session.getIdentifier(Object entity) (调用Session.getIdentifier(Object entity)方法) 前面两句话理解上没有任何问题, 最后一句有些疑问:这个方法有什么实际意义?当得到一个Model类后不也就自然而然地以getId方式获得它的ID,为什么还要绕一下呢?这里面有什么玄机? 看Session实现类SessionImpl对getIdentifier方法实现的源码,也没发现什么特殊之处。 大家说说看这个方法ession.getIdentifier(Object entity)有什么特殊意义?Hibernate为什么加这么个方法呢?实际中怎么用? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-11
如果id自动生成,getIdentifier可以在将实体对象插入到数据库后得到数据项的id,有时会用到这种功能;
session.save(object); String id = session.getIdentifier(object).toString; |
|
返回顶楼 | |
发表时间:2009-08-11
piabo2161978 写道 如果id自动生成,getIdentifier可以在将实体对象插入到数据库后得到数据项的id,有时会用到这种功能;
session.save(object); String id = session.getIdentifier(object).toString; 在执行session.save(object)操作时,实体对象已经插入到数据库了吧?这时object里的id已经有值了,以object.getId()来直接取id值就可以了吧?为什么还要用getIdentifier来绕个远呢? |
|
返回顶楼 | |
发表时间:2009-08-11
rmn190 写道 piabo2161978 写道 如果id自动生成,getIdentifier可以在将实体对象插入到数据库后得到数据项的id,有时会用到这种功能;
session.save(object); String id = session.getIdentifier(object).toString; 在执行session.save(object)操作时,实体对象已经插入到数据库了吧?这时object里的id已经有值了,以object.getId()来直接取id值就可以了吧?为什么还要用getIdentifier来绕个远呢? 你去取来看看...你不去get一次 怕不得行哦 |
|
返回顶楼 | |
发表时间:2009-08-16
最后修改:2009-08-16
// not for internal use: public Serializable getIdentifier(Object object) throws HibernateException { errorIfClosed(); checkTransactionSynchStatus(); if ( object instanceof HibernateProxy ) { LazyInitializer li = ( (HibernateProxy) object ).getHibernateLazyInitializer(); if ( li.getSession() != this ) { throw new TransientObjectException( "The proxy was not associated with this session" ); } return li.getIdentifier(); } else { EntityEntry entry = persistenceContext.getEntry(object); if ( entry == null ) { throw new TransientObjectException( "The instance was not associated with this session" ); } return entry.getId(); } } 看源码就知道了,如果对象是HibernateProxy就是用延迟加载 优点是当对象是HibernateProxy的时候可以延迟加载其他属性提高性能(如果其他属性是非必要的) 而且不需要知道持久化对象的标识字段的名称 缺点当然就是不如属性获取来得直观 |
|
返回顶楼 | |
发表时间:2009-09-20
批量操作时,如果要使用JDBC操作插入,但ID不是数据库生成的,那么可使用此方法或得ID,再使用JDBC插入,我的应用用的是UUID,就是这样取得新记录ID的。
|
|
返回顶楼 | |