Hibernate学习(五):session.update

关于Session接口的update方法主要有以下几点要注意:sql

1.输入参数数据库

通常而言,传递给update的对象要是处于游离状态的对象。若是传一个持久化对象,那么update方法就是多余的,由于Hibernate的脏检查机制会自动根据对象属性值的变化向数据库发送一条update语句;若是传入的对象处于临时状态,那么此时Hibernate应该会抛出异常。由于Hibernate在更新数据时会根据对象的OID去数据库查找相应的记录并更新之,而在数据库中是没有记录与这个临时对象相关联的,所以Hibernate会抛出异常,固然若是你人为的给临时对象指定一个OID就该另当别论了,以下所示代码片断:缓存

…………………………………………session

Customer customer=new Customer(); ide

customer.setId( 3L ); spa

customer.setName(“Cindyelf”); orm

session.update(customer);对象

…………………………………………接口

这段代码会致使以下的sqlupdate Customer set name=’Cindyelf’ where  id=3;固然若是数据库不存在id3的那行记录,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对象,它的OID6,而后我在session2load一个OID6的对象customer1,而后在session2update以前的customer,注意,对于session2而已,customer1是处于游离状态的,由于它不处于session2的缓存中。此时程序会报以下错误:a different object with the same identifier value was already associated with the session

相关文章
相关标签/搜索