hibernate 并发控制 不同状态的对象调用不同的方法执行规律

使用hibernate的version做并发控制,对于不同的状态的对象其执行结果不同。
1、游离对象(具有ID的对象)
   Customer Customer = new Customer();
   Customer.setId(1L);
   Customer.setUserName("nick");
   Customer.setVersion(9);

   A.执行session.save(Customer )---会执行insert操作,version对其没有影响,设置不设置无关。
   B.执行session.update(Customer )---会执行update操作,并且会检查version版本.如果不设置version,会抛NullPointException,并且如果version设置的不正确,不是当前version,又会抛出StaleObjectStateException异常
   C.执行sessionsaveOrUpdate(Customer)---
     如果主键是自增长的:
   
         如果设置version,则执行update操作
         如果不设置version,则执行insert操作
     如果主键不是自增长的:会先执行select,再执行update


可以总结如下,hibernate如何判断对象状态:
1、如果对象没有主键值,则为临时对象,只能执行insert操作
2、如果对象有主键值,进一步看version,有version则视为持久化或游离状态,只能执行update
    如果对象有主键值,没有version值,则视为临时对象,只能执行insert操作。

    即持久化状态必须有主键,有version值(如果有的话)。

猜你喜欢

转载自xls9577087.iteye.com/blog/2238464