Как правильно использовать оптимистическую блокировку, перехватывать исключения StaleObjectState с помощью Spring и Hibernate - PullRequest
0 голосов
/ 02 марта 2012

Я пытаюсь использовать Hibernate впервые.Мне нужно использовать оптимистическую блокировку, чтобы победил первый коммит.Я разработал, как это сделать с помощью номеров версий, управляемых hibernate, в тестовом проекте.В тестовом проекте используется только Hibernate, а не Spring, поэтому код для работы с базой данных выглядит примерно так:

get session from sessionfactory
open transaction
perform database actions
commit transaction with error handling

Насколько я понимаю, я могу использовать Spring для управления транзакциями и сокращения кодапримерно так:

perform database actions

Чего я не знаю:

  1. Как вообще настроить Spring.Я хотел бы использовать XML над аннотациями.Просто ссылка на хорошую ссылку была бы потрясающей.
  2. Как обработка ошибок входит в реализацию Spring?Где бы я поймал StaleObjectStateException?
  3. Какая структура дизайна лучше?Я видел синглтон DAO, который все потоки используют для взаимодействия с базой данных, и это показалось мне разумным.

1 Ответ

1 голос
/ 06 марта 2012

Обычно вы просто добавляете поле версии к вашим сущностям, у вас также должен быть идентификатор.

В вашем коде вам нужно управлять этой версией, то есть код, вызывающий ваш уровень персистентности, должен сначала получить объект с его правильным номером версии, прежде чем изменять сущность.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...