спящий источник: PrePersist место для бизнес-логики? - PullRequest
1 голос
/ 27 октября 2010

Я использую Spring + Hibernate для создания и сохранения записи в базе данных MySQL.

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

Я подумал об использовании метода в моем классе сущностей с аннотацией @PrePersist для реализации этого поведения. Это правильное место, чтобы поставить такой метод?

Этот вопрос возник у меня, поскольку я не знал, как проверить таблицу базы данных на предмет уникальности случайной строки, поскольку я не могу придумать, как ссылаться на экземпляр HibernateTemplate пружины для выполнения запроса из класса сущностей.

Любое предложение очень ценится.

1 Ответ

0 голосов
/ 28 октября 2010

Непосредственно перед сохранением записи я хочу, чтобы моя система сгенерировала случайную строку, которая будет сохранена в поле в сохраняемой сущности.

A PrePersist метод обратного вызова жизненного цикла был бы действительно идеальным для этого варианта использования.

Этот вопрос возник у меня, поскольку я не знал, как проверить таблицу базы данных на предмет уникальности случайной строки, поскольку я не могу придумать, как обратиться к экземпляру HibernateTemplate пружины, чтобы выполнить запрос из класса сущностей.

HibernateTemplate / JpaTemplate или нет, на самом деле нет способа проверить уникальность значения с помощью SQL-запроса (по крайней мере, не на 100% детерминистическим способом) без блокировки всей таблицы, и вы, вероятно, не Я не хочу этого. Без блокировки всей таблицы вы можете столкнуться с условием гонки: в то время как поток T1 будет выполнять выборку, поток T2 может вставить значение, которое T1 не нашел, и зафиксировать первым, что приведет к сбою последующей вставки из T1 .

Другими словами, единственный способ гарантировать уникальность или столбец - вставить запись и зафиксировать транзакцию (база данных может использовать отложенные проверки ограничений, поэтому фиксация требуется).

...