使用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值(如果有的话)。
hibernate 并发控制 不同状态的对象调用不同的方法执行规律
猜你喜欢
转载自xls9577087.iteye.com/blog/2238464
今日推荐
周排行