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