Как обрабатывать повторяющиеся значения полей с помощью Spring Data JPA? - PullRequest
0 голосов
/ 25 апреля 2019

Я использую Spring Data JPA для сохранения объекта User для моего проекта.

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

@Entity
@Data
@Table(schema = "public", name = "user", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
@NoArgsConstructor
@AllArgsConstructor
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column
    private String email;
}

UserRepository:

public interface UserRepository extends PagingAndSortingRepository<User, Integer>, JpaSpecificationExecutor<User> {

    List<User> findAllByAddressesContaining(Address address);

    User findByEmailIgnoreCase(String email);

    List<User> findAllByRoles_id(int id);
}

Когда я пытаюсь сохранить объект пользователя с электронной почтой, уже существующей в БД, с userRepository.save(user) Это работает, поэтому он обновляет существующий объект пользователя в БД. Я хочу, чтобы исключение выдавалось в случае нарушения уникального ограничения вместо обновления нового объекта, поэтому я смогу отправлять статус 409 CONFLICT с моего весеннего контроллера MVC. Как мне достичь этого наиболее эффективным и «правильным» способом?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

То, что в объектной модели это выражение

uniqueConstraints = @UniqueConstraint (columnNames = "email")
* Использование 1003 * вовсе не означает, что в таблице действительно создано ограничение для столбца.

Documenttation: ... Используйте аннотацию @UniqueConstraint, чтобы указать, что уникальное ограничение должно быть включено в сгенерированный DDL для первичной или вторичной таблицы. ...

Это не значит, что что-то будет проверено во время выполнения. Убедитесь, что это ограничение столбца действительно существует на уровне таблицы базы данных. Я полагаю, вы используете весну? Вам необходимо использовать это свойство:

spring.jpa.hibernate.ddl-auto = none/create/update/validate <- select this

Это создаст / обновит / проверит схему при запуске контекста. validate - просто сравните ваше определение сущности (@Entity) с тем, что описано в схеме базы данных (типы, столбцы, ограничения и т. д.), и выдаст ошибку, если, например, в схему не добавлено ограничение.

После добавления ограничения данных в этот столбец вы будете получать исключение нарушения ограничения при каждом его получении.

0 голосов
/ 25 апреля 2019

Вместо непосредственного сохранения вы можете сделать одну вещь! Вы можете создать собственный метод, который принимает emailId в качестве параметра и возвращает целое число, например ... public int getCountForEmailId (String emailId); В этом случае вы передаете свой собственный запрос или HQL или JPQ и сначала проверяете, существует ли какой-либо emaild id, и вы можете вернуть его и выдать пользовательское исключение из контроллера, если return count> 0. Надеюсь, это вам понятно.

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