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值(如果有的话)。

你可能感兴趣的:(hibernate 并发控制 不同状态的对象调用不同的方法执行规律)