`

关于Session.getIdentifier(Object entity)的讨论

阅读更多
在重读Hibernate时,在4.2.2一节发现这么一段话:
  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为什么加这么个方法呢?实际中怎么用?
分享到:
评论
6 楼 lgdlgd 2009-09-20  
批量操作时,如果要使用JDBC操作插入,但ID不是数据库生成的,那么可使用此方法或得ID,再使用JDBC插入,我的应用用的是UUID,就是这样取得新记录ID的。
5 楼 gordianyuan 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的时候可以延迟加载其他属性提高性能(如果其他属性是非必要的)
而且不需要知道持久化对象的标识字段的名称
缺点当然就是不如属性获取来得直观
4 楼 xuch 2009-08-16  
和lz一样的困惑!!
3 楼 wg351 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一次 怕不得行哦
2 楼 rmn190 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来绕个远呢?
1 楼 piabo2161978 2009-08-11  
如果id自动生成,getIdentifier可以在将实体对象插入到数据库后得到数据项的id,有时会用到这种功能;

session.save(object);
String id = session.getIdentifier(object).toString;

相关推荐

    Android使用getIdentifier()获取资源Id的方法

    本文实例讲述了Android使用getIdentifier()获取资源Id的方法。分享给大家供大家参考,具体如下: int i= getResources().getIdentifier(icon, drawable, getPackageName()) ; if(i>0) {Log.i(aa,aa);} else {Log....

    CustomResManage.java

    int id = context.getResources().getIdentifier(iconName, "string", context.getPackageName()); String str = context.getResources().getString(id); 获取Drawable资源: int id = context.getResources()....

    android 获取APP的唯一标识applicationId的实例

    使用getIdentifier()方法可以方便的获各应用包下的指定资源ID。 方式一 int indentify = getResources().getIdentifier(“com.test.demo:drawable/icon”,null,null); 第一个参数格式是:包名 + : +资源文件夹名 +...

    Android中实现根据资源名获取资源ID

    接触过Android开发的同学们都知道在Android中访问程序资源基本都是通过资源ID来访问。这样开发起来很简单,并且... 通过调用Resources的getIdentifier可以很轻松地得到资源ID。 几个简单的示例: 代码如下: Resources

    yfz_getIdentifier.zip

    Android安卓-获取控件的id(标识符)-根据控件id获取对应的值或控件名字-动态获取R.string的值

    基于Android中获取资源的id和url方法总结

    int strId = getResources().getIdentifier(OK, string, getPackageName()); 1.2 color型 比如下面: <”colorPrimary”>>#3F51B5 << /color>> //color资源中 id 获取 int colorId = getRe

    android电子签名,屏幕上手写签名

    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; } 3,...

    dinnerplanner-android-NTH_YS

    交互编程 - 实验室作业 -... getIdentifier(name, " drawable " , context . getPackageName()); } 然后在您的视图类中,您有一个要将图像传递给的组件(例如 ),然后执行以下操作: ImageView img = // You either

    SqInject:基于getIdentifier实现的Android控件注入库

    SqInject目录一,功能说明二,接收说明三,使用范例四,工程模块说明五,版本说明一,功能说明1,使用BindView将属性和id绑定(绑定采用的是getIdentifier的方式绑定的,非R.id) 2,BindId将id的值注入到属性中...

    swipeback-Android侧滑返回分析和实现(不高仿微信).zip

    { int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); try { return getResources().getDimensionPixelSize(resourceId);  } catch (Resources....

    getIdentifierSample.rar

    使用getIdentifier()方法根据资源名来获取资源id

    C# 获取硬件参数的实现方法

    private static string GetIdentifier(string wmiClass, string wmiProperty, string wmiMustBeTrue) { string result = ; System.Management.ManagementClass mc = new System.Management.ManagementClass(wmi...

    SerialAndParallelExecutor

    串行和并行执行器 ParallelAndSerialExecutor 是一个执行器,它将根据传入的任务并行或串行运行任务。要串行执行任务,请使用扩展 {@link SerialRunnable} 的... public String getIdentifier() { return identifier;

Global site tag (gtag.js) - Google Analytics