hibernate之saveOrUpdate方法以及unsaved-value属性

 

hibernate之saveOrUpdate方法以及unsaved-value属性
----------
Session的saveOrUpdate方法是由Hibernate来判断被操作对象究竟是一个持久化对象还是临时自由状态对象。这需要在对象映射文件的主键id中定义unsaved-value属性,如果不显式定义,则默认为unsaved-value=null(默认情况,适用于大多数对象类型主键Integer/Long/String/...) 
unsaved-value可以是下列几个选项: 
1)null:主键是对象类型,Hibernate判断操作对象的主键是否为null,来判断操作对象是否以被持久化,如果是,调用save方法,生成insert语句,在数据库中增加一条记录,如果不是,设置主键则直接生成update的SQL语句,发送update,如果数据库中没有那条记录则抛出异常。 
2)none:由于不论主键属性为任何值,都不可能为none,因此Hibernate总是对被操作对象发送update。 
3)any:由于不论主键属性为任何值,都肯定为any,因此Hibernate总是对被操作对象发送save,Hibernate生成主键。
如例:
<id name="id" column="ID" type="string" unsaved-value="null"> <generator class="uuid.hex" /> </id> 
如果主键属性不是对象型,而是基本类型,如int/long/double/...,那么你需要指定一个数值型的unsaved-value,例如:
unsaved-null="0"  
在此提醒大家,很多人以为对主键属性定义为int/long,比定义为Integer/Long运行效率来得高,认为基本类型不需要进行对象的封装和解构操作,因此喜欢把主键定义为int/long的。但实际上,Hibernate内部总是把主键转换为对象型进行操作的,就算你定义为int/long型的,Hibernate内部也要进行一次对象构造操作,返回给你的时候,还要进行解构操作,效率可能反而低也说不定。因此大家一定要扭转一个观点,在Hibernate中,主键属性定义为基本类型,并不能够比定义为对象型效率来的高,而且也多了很多麻烦,因此建议大家使用对象型的Integer/Long定义主键。 

unsaved-value="none"和 unsaved-value="any" 
主主要用在主键属性不是通过Hibernate生成,而是程序自己setId()的时候。 

 

你可能感兴趣的:(Hibernate,数据库,String,null,insert,generator)