关于Session接口的update方法主要有以下几点要注意:sql
1.输入参数数据库
通常而言,传递给update的对象要是处于游离状态的对象。若是传一个持久化对象,那么update方法就是多余的,由于Hibernate的脏检查机制会自动根据对象属性值的变化向数据库发送一条update语句;若是传入的对象处于临时状态,那么此时Hibernate应该会抛出异常。由于Hibernate在更新数据时会根据对象的OID去数据库查找相应的记录并更新之,而在数据库中是没有记录与这个临时对象相关联的,所以Hibernate会抛出异常,固然若是你人为的给临时对象指定一个OID就该另当别论了,以下所示代码片断:缓存
…………………………………………session
Customer customer=new Customer();
customer.setId(
customer.setName(“Cindyelf”);
session.update(customer);对象
…………………………………………接口
这段代码会致使以下的sql:update Customer set name=’Cindyelf’ where id=3;固然若是数据库不存在id为3的那行记录,Hibernate就会抛出异常。而给临时对象指定OID是不合规范的操做,应尽可能避免。也就是说无论传入是什么状态对象,数据库中必需要有一条记录与这个对象的OID相对应,不然抛出异常。ci
2.操做
执行update方法的时候,Hibernate会首先把传入的对象放入Session的缓存中,使之持久化,而后计划执行一个update语句。Hibernate在生成sql语句的时候会根据对象的当前属性值来组装sql语句,也就是说,无论程序中修改了多少次属性值,在执行时只会执行一条update一句。
此外,在update的官方API中特地强调了一点,“若是在session的缓存中有一个持久化对象和所要更新的对象具备相同的OID,那么Hibernate会抛出异常”。下面的代码片断演示了这个错误:
…………………………………………
Customer customer=new Customer();
session1.save(customer);
…………………………………………
…………………………………………
Customer customer1=(Customer)session.load(Customer.class,new Long(6))
session2.update(customer);
…………………………………………
如上所示,我在session1中持久化了一个Customer对象,它的OID是6,而后我在session2中load一个OID为6的对象customer1,而后在session2中update以前的customer,注意,对于session2而已,customer1是处于游离状态的,由于它不处于session2的缓存中。此时程序会报以下错误:a different object with the same identifier value was already associated with the session。