hibernate的saveorUpdate与unsaved-value,save,update,delete总结_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
2
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1940 | 回复: 1   主题: hibernate的saveorUpdate与unsaved-value,save,update,delete总结        下一篇 
    本主题由 koei123 于 2015-6-1 14:53:28 移动
shary
注册用户
等级:新兵
经验:54
发帖:66
精华:0
注册:2011-8-31
状态:离线
发送短消息息给shary 加好友    发送短消息息给shary 发消息
发表于: IP:您无权察看 2015-5-5 15:48:53 | [全部帖] [楼主帖] 楼主

一、saveorUpdate与unsaved-value
到底是sava还是update 
Hibernate需要判断被操作的对象究竟是一个已经持久化过的持久对象还是临时对象。 
1).主键Hibernate的id generator产生

<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="increment" />
</id>
Project project = new Project();
project.setId(XXX);
this.projectDao.saveOrUpdate(project);


1、默认unsaved-value="null" 
主键是对象类型,hebernate判断project的主键是否位null,来判断project是否已被持久化
是的话,对project对象发送save(project), 
若自己设置了主键则直接生成update的sql,发送update(project),即便数据库里没有那条记录。 
主键是基本类型如int/long/double/ 
自己设置unsaved-null="0"。 
所以这样的话save和update操作肯定不会报错。

2、unsaved-value="none", 
由于不论主键属性为任何值,都不可能为none,因此Hibernate总是对project对象发送update(project)

3、unsaved-value="any" 
由于不论主键属性为任何值,都肯定为any,因此Hibernate总是对project对象发送save(project),hibernate生成主键。

Hibernate文档中写到 
saveOrUpdate()完成了如下工作: 
如果对象已经在这个session中持久化过了,什么都不用做 
如果对象没有标识值,调用save()来保存它 
如果对象的标识值与unsaved-value中的条件匹配,调用save()来保存它 
如果对象使用了版本(version或timestamp),那么除非设置unsaved-value="undefined",版本检查会发生在标识符检查之前. 
如果这个session中有另外一个对象具有同样的标识符,抛出一个异常

2).主键由自己来赋值

<id name="id" type="java.lang.Long">
<column name="ID" precision="22" scale="0" />
<generator class="assigned" />
</id>
Project project = new Project();
project.setId(XXX);
this.projectDao.saveOrUpdate(project);


1、默认unsaved-value="null" 
这时有所不同,hibernate会根据主键产生一个select,来判断此对象是否已被持久化
已被持久化则update,未被持久化则save。 
2、unsaved-value="none",update对象,同上

3、unsaved-value="any" ,save对象, 
如果自己自己设置的ID在数据库中已存在,则报错。

二、save与update操作

显式的使用session.save()或者session.update()操作一个对象的时候,实际上是用不到unsaved-value的 
在同一Session,save没什么可说得 
update对象时, 最直接的更改一个对象的方法就是load()它,保持Session打开,然后直接修改即可: 

Session s =…
Project p = (Project) sess.load(Project.class, id) );
p.setName(“test”);
s.flush();


不用调用s.update(p);hibernate能察觉到它的变化,会自动更新。当然显示调用的话也不会错

Hibernate文档中写到 
update()方法在下列情形下使用: 
程序在前面的session中装载了对象 
对象被传递到UI(界面)层 
对该对象进行了一些修改 
对象被传递回业务层 
应用程序在第二个session中调用update()保存修改

三、delete操作

删除时直接自己构造一个project即可删除 

this.projectDao.delete(preojct);


以前删除我是这样写的 

public void deleteProject(String id) {
      Project project = (Project) this.projectDao.get(Project.class, id);
      if (project != null) {
            this.projectDao.delete(project);
      }


即这样也是可以的 

Project project = new Project();
project.setId(id);
this.projectDao.delete(project).


如果有级联关系,需要把级联的子类也构造出来add进去,同样可以删除。

--转自 北京联动北方科技有限公司

该贴由koei123转至本版2015-6-1 14:53:28



赞(0)    操作        顶端 
hei_nihao
注册用户
等级:少校
经验:1279
发帖:19
精华:0
注册:2015-4-17
状态:离线
发送短消息息给hei_nihao 加好友    发送短消息息给hei_nihao 发消息
发表于: IP:您无权察看 2015-5-7 9:13:22 | [全部帖] [楼主帖] 2  楼

unsaved-value,看着真别扭,还有, precision="22" scale="0"这个是用来干嘛的?



赞(0)    操作        顶端 
总帖数
2
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论