Проблема создания пользователей на простой весенней загрузке crud api - PullRequest
0 голосов
/ 21 сентября 2018

После первого запуска API первые 3 пользовательских запроса на создание сообщений не выполняются (снимок экрана внизу сообщения) с приведенной ниже ошибкой (уникальное ограничение ограничений).

Последующие запросы работают, когда первый созданный пользователь имеет идентификатор 4, затем 5 и т. Д. *

Как я могу заставить создание пользователя работать с первой (3) попытки?

Я подозреваю, что это связано с предварительным заполнением моих пользователей, что я делаю с помощью приведенного ниже сценария.Возможно, автоматическая генерация идентификатора сначала пытается выполнить 1,2,3 - которые уже используются?

INSERT INTO user VALUES (1, 'user1', 'pass1', 'ADMIN'); INSERT INTO user VALUES (2, 'user2', 'pass2', 'USER'); INSERT INTO user VALUES (3, 'user3', 'pass3', 'ADMIN')

не удалось выполнить оператор;SQL [н / п];ограничение [\ "ПЕРВИЧНЫЙ КЛЮЧ НА PUBLIC.USER (ID) \";Оператор SQL: \ ninsert в значения пользователя (имя, пароль, роль, идентификатор) (?,?,?,?) [23505-196]];вложенным исключением является org.hibernate.exception.ConstraintViolationException: не удалось выполнить инструкцию ",

@RestController
public class UserResource {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/users")
    public List<User> retrievaAllUsers() {
        return userRepository.findAll();
    }

    @DeleteMapping("/users/{id}")
    public void deleteUser(@PathVariable Long id) {
        userRepository.deleteById(id);
    }

    @PostMapping("/users")
    public ResponseEntity<Object> createUser(@RequestBody User user) {
        User savedUser = userRepository.save(user);

        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
                .path("/{id}")
                .buildAndExpand(savedUser.getId())
                .toUri();

        return ResponseEntity.created(location).build();

    }


}

-

@Entity
@Table(name = "user")
public class User {

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String password;
    @Enumerated(EnumType.STRING)
    private Role role;

    public User() {
        super();
    }

    public User(Long id, String name, String password, Role role) {
        this.id = id;
        this.name = name;
        this.password = password;
        this.role = role;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Role getRole() {
        return role;
    }

    public void setRole(Role role) {
        this.role = role;
    }
}

enter image description here

  • edit - добавлен класс ролей

    public enum Role {
    
    USER, ADMIN
    

    }

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Просто предположение.Во-первых, вы вводите данные с помощью sql, но в своем коде вы создаете нового пользователя и сохраняете его в db.Так что это новое творение дает идентификатор как 1.Но в вашей базе данных есть запись пользователя, первичный ключ которого равен 1.Пожалуйста, удалите все значения из базы данных и создайте свои записи из контроллера остальных.

По моему мнению, используйте такую ​​последовательность, не забудьте создать последовательность в db;

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_generator")
@SequenceGenerator(name="user_generator", sequenceName = "user_seq", allocationSize=50)

Или прочитайте это и выберите решение вашей проблемы.

  • AUTO : Hibernate выбирает стратегию генерации на основе используемого диалекта,
  • IDENTITY : Hibernate опирается на автоматически увеличенный столбец базы данных для генерации первичного ключа,
  • SEQUENCE : Hibernate запрашивает значение первичного ключа из последовательности базы данных,
  • TABLE : Hibernate использует таблицу базы данных для имитации последовательности.

PS: Идентичность должна быть более актуальной, но попробуйте другие.

0 голосов
/ 22 сентября 2018

Вы должны также указать имена столбцов, чтобы убедиться, что они упорядочены.

ВСТАВИТЬ INTO пользователя (идентификатор, имя, пароль, роль) ЗНАЧЕНИЯ (1, 'user1', 'pass1', 'ADMIN');

INSERT INTO user (идентификатор, имя, пароль, роль) VALUES (2, 'user2', 'pass2', 'USER');

INSERT INTO user (id, name,пароль, роль) VALUES (3, 'user3', 'pass3', 'ADMIN')

0 голосов
/ 21 сентября 2018

Если вы используете AUTO_INCREMENT в определении столбца, попробуйте изменить стратегию с GenerationType.AUTO на GenerationType.IDENTITY.

Я заметил подобное поведение при обновлении проекта с Spring Boot 1.5 до 2.0.

...