Но все же я не уверен, как это работает?
Допустим, у сущности MyEntity
есть аннотированное version
свойство:
@Entity
public class MyEntity implements Serializable {
@Id
@GeneratedValue
private Long id;
private String name;
@Version
private Long version;
//...
}
При обновлении поле, помеченное @Version
, будет увеличено и добавлено к предложению WHERE
, примерно так:
UPDATE MYENTITY SET ..., VERSION = VERSION + 1 WHERE ((ID = ?) AND (VERSION = ?))
Если предложение WHERE
не соответствует записи (поскольку эта же сущность уже была обновлена другим потоком), поставщик сохраняемости выдаст OptimisticLockException
.
Означает ли это, что мы должны объявить наше поле версии как окончательное
Нет, но вы можете подумать о том, чтобы защитить сеттер, поскольку вы не должны его вызывать.