Обычно вы просто добавляете поле версии к вашим сущностям, у вас также должен быть идентификатор.
В вашем коде вам нужно управлять этой версией, то есть код, вызывающий ваш уровень персистентности, должен сначала получить объект с его правильным номером версии, прежде чем изменять сущность.
Hibernate позаботится об обновлении поля версии. Так что вам просто нужно, чтобы оно было на последнем значении, которое было установлено. При обновлении сущности hibernate будет увеличивать поле, поэтому вам не нужно создавать последовательность, как это было бы для идентификатора.
Код клиента должен управлять исключением staleObjectStateException. Когда возникает это исключение, это означает, что объект был изменен другим кодом или вы не получили последнюю версию. Вы можете решить, что делать дальше: получить более свежую версию и внести изменения, указать пользователю, что кто-то еще сделал изменение, если есть пользовательский интерфейс ...
Вы также можете создать базовый класс для ваших сущностей, чтобы всегда иметь поля id и version. Обратите внимание, что номер версии полезен, если он является объектом чтения-записи.
Наконец, вы хотите аннотировать поле версии с помощью @ javax.persistence.Version
На самом деле это также концепция JPA:
private int version;
public AbstractReadWriteEntity() {}
@javax.persistence.Version
@javax.persistence.Column(name = "VERSION")
public int getVersion()...
Также, чтобы понять, что он делает на уровне БД: http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html#transactions-optimistic