`

关于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(...

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

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

    Android编程实现通过反射获取资源Id的方法

    在Android中,资源Id可以通过getResources().getIdentifier()方法来获取,例如,获取layout资源Id可以使用getResources().getIdentifier(paramString, "layout", paramContext.getPackageName());获取string资源Id...

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

    Android 中获取资源的 id 是通过 getResources().getIdentifier() 方法实现的,该方法需要三个参数:资源名称、资源类型和包名。下面是获取不同类型资源 id 的示例代码: 1.1 获取 string 资源 id String 资源是一...

    android应用播放raw文件中的音乐

    2. **获取资源ID**:在Java代码中,你可以使用`getResources().getIdentifier()`方法来获取音频资源的ID。例如: ```java int musicResourceId = getResources().getIdentifier("my_music", "raw", getPackageName...

    yfz_getIdentifier.zip

    同时,我们也会讨论如何动态获取`R.string`的值,这是资源管理中的一个重要概念。 1. **获取控件ID**: 在Android中,每个UI控件都有一个唯一的ID,它是在XML布局文件中定义的。例如,对于一个TextView,我们可能...

    robotium文档

    2. 使用 `getResources().getIdentifier()` 方法获取 id 值:`int id = act.getResources().getIdentifier("menu_add", "id", act.getPackageName());` 3. 查找并获取对应视图(View):`View view = act....

    安卓换肤主题更换夜间模式相关-android背景的更换手动向右滑动更换资源文件里的图片.rar

    在更换背景图片时,我们首先需要获取新的图片资源ID,这可以通过Resources.getIdentifier方法实现,传入资源文件的名称(如"night_mode_background")和类型(如"drawable")。获取到资源ID后,将其设置给ImageView...

    android 通过资源字符串获得对应ID

    对于希望继续使用`res/drawable`目录存储图片资源的场景,可以通过`getIdentifier`方法来实现资源ID的获取。 ##### 实现步骤: 1. **资源存放位置**:保持图片资源位于`res/drawable`目录下。 2. **资源ID获取**:...

    一个动态获取控件的小例子。

    此外,如果控件ID有特定的命名规则,如“button_1”,“button_2”等,我们还可以使用`Resources.getSystem().getIdentifier()`方法动态获取ID,然后使用`findViewById()`找到对应的控件: ```java String baseId =...

    Android 获取屏幕相关数据的demo

    int resourceId = getResources().getIdentifier("navigation_bar_height", "dimen", "android"); if (resourceId > 0) { return getResources().getDimensionPixelSize(resourceId); } return 0; } ``` 请注意...

    修改MaterialCalendarView星期月份为中文

    calendarView.monthDisplayHelper = object : CalendarMonthAdapter.CalendarDisplayNameHelper { override fun getDisplayName(month: Int, year: Int, type: Int): String { return resources.getString...

    android读取raw和assets下资源文件demo

    2. 获取资源ID:使用`Resources.getIdentifier()`方法,传入文件名(不包括扩展名)和资源类型(这里是"raw"),可以得到对应的ID。 3. 打开输入流:使用`Resources.openRawResource()`方法,传入资源ID,即可得到一...

    安卓读取raw下txt文件

    int resourceId = getResources().getIdentifier("textfile", "raw", getPackageName()); ``` 这里`"textfile"`是文件名,`"raw"`是资源类型,`getPackageName()`返回应用的包名。 2. **打开输入流**: 使用`...

Global site tag (gtag.js) - Google Analytics