随笔-7  评论-24  文章-102  trackbacks-0


预备知识:出自:hibernate的各种保存方式的区别 (save,persis,update,saveOrUpdte,merge等)
在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient、persistent、detached
    transient:瞬态或者自由态
    persistent:持久化状态
    detached:脱管状态或者游离态
脱管状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。
持久化实例可以通过调用 delete()变成脱管状态。通过get()或load()方法得到的实例都是持久化状态的。
脱管状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。

save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,
而update()或merge()会引发SQLUPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,
它也会引起SQLUPDATE。saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE


[推荐] 解析eclipse下生成Hibernate DAO中的几个方法出自: http://blog.csdn.net/xzknet/archive/2007/06/06/1641204.aspx
void save(Usertable transientInstance)
     方法提供了向数据库中添加数据的功能
void delete(Usertable persistentInstance) 
     方法看名知意是用来删除的.
Usertable findById(java.lang.Integer id)
     方法实现了按ID查询数据.
List findByExample(Usertable instance) 
     方法实现的功能相当于"select * from Usertable"实现的功能就是查询所有
List findByProperty(String propertyName, Object value) 
     方法用来灵活的提供一种按条件查询的方法,你可以自己定义要按什么样的方式查询.


CodeDepts merge(CodeDepts detachedInstance) 
     将传入的detached状态的对象的属性复制到持久化对象中,并返回该持久化对象。如果该session中没有关联的持久化对象,加载一个,如果传入对象未保存,保存一个副本并作为持久对象返回,传入对象依然保持detached状态。
void attachDirty(CodeDepts instance)
     将传入的对象持久化并保存。如果对象未保存(Transient状态),调用save方法保存。如果对象已保存(Detached状态),调用update方法将对象与Session重新关联。
attachClean(CodeDepts instance)
     将传入的对象状态设置为Transient状态。



.merge(object)  合并、吞入hibernate的各种保存方式的区别 (save,persis,update,saveOrUpdte,merge等)
如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例
如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例,最后返回该持久实例
用户给出的这个对象没有被关联到session上,它依旧是脱管的
重点是最后一句:
    当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态。
    但当我们使用merge的时候,执行完成,我们提供的对象A还是脱管状态,hibernate或者new了一个B,或者检索到一个持久对象B,并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态


NonUniqueObjectException问题的解决
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
解决方法:
     使用 hibernate 3 的 merge 方法. session.merge(newDetail)即可,它会在 session 缓存中找到持久化对象,把新对象的属性赋过去,再保存原session中的持久化对象。
     如果在session或数据库中没有的对象,用merge方法的话,它也能够帮你把记录 insert 到表中,相当于 save 方法。


 
.findByExample(object)使用Spring封装的Hibernate方法
按照 object 所设置的属性值来组合查询语句的where条件,比如:
    Users anUser = new Users();
    anUser.setUserName("a");
    anUser.setPassWord("b"); 
                           =====> where username='a' and password='b'
    anUser.setRealName("");
                           =====> where username='a' and password='b' and realname=''
posted on 2008-09-05 23:11 黄小二 阅读(722) 评论(0)  编辑  收藏 所属分类: S/S2SH

只有注册用户登录后才能发表评论。


网站导航: