saveorUpdate与unsaved-value

探讨Hibernate中主键生成策略与unsaved-value属性如何影响saveOrUpdate方法的行为。解释不同主键生成方式下,对象状态如何判断及对应的保存或更新操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> saveorUpdateunsaved-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() 保存修改
(网上收集)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值