Невозможно добавить строку таблицы из-за ошибки «Невозможно вставить явное значение для столбца идентификаторов в таблице« Пользователи », когда для IDENTITY_INSERT установлено значение OFF» - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь сохранить пользователя в базе данных, используя Spring boot и JPA , но он не работает из-за этой ошибки.

com.microsoft.sqlserver.jdbc.SQLServerException: 
Cannot insert explicit value for identity column in table 'Users'
when IDENTITY_INSERT is set to OFF.

Ошибка ясно, поэтому я попытался изменить вставку Identity в моей базе данных, которая была успешной, но ошибка все еще происходит. Второе, что странно в этом вопросе, это то, что я не пытаюсь указать значение c в качестве идентификатора для моей базы данных. Вот точная строка, которая отвечает за сохранение данных:

userService.save(new User("wikimmax","test","testmail@op.pl","test", Arrays.asList(new Role("ROLE_USER"))));

И есть мой класс пользователя

import javax.persistence.*;
import java.util.Collection;

@Entity
@Table(name = "Users",uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    private String firstName;
    private String lastName;
    private String email;
    private String password;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinTable(
            name = "users_roles",
            joinColumns = @JoinColumn(
                    name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(
                    name = "role_id", referencedColumnName = "id"))
    private Collection<Role> roles;

    public User() {
    }

    public User(String firstName, String lastName, String email, String password) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
    }

    public User(String firstName, String lastName, String email, String password, Collection<Role> roles) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
        this.roles = roles;
    }

    public Long getId() {
        return id;
    }

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

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

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

    public Collection<Role> getRoles() {
        return roles;
    }

    public void setRoles(Collection<Role> roles) {
        this.roles = roles;
    }

    @Override
    public String toString() {

        return "User{" +
                "id=" + id +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", password='" + "*********" + '\'' +
                ", roles=" + roles +
                '}';
    }
}

Есть моя таблица

There Is My table

Любые идеи высоко ценятся

ОБНОВЛЕНИЕ Мне удалось напечатать SQL запрос, сгенерированный hibernate, и он выглядит так:

    insert 
    into
        Users
        (email, firstName, lastName, password, id) 
    values
        (?, ?, ?, ?, ?)

1 Ответ

0 голосов
/ 07 марта 2020

Пожалуйста, отредактируйте вопрос и добавьте оператор вставки.

вы не можете вставить какие-либо данные в столбец идентификаторов, поскольку эти столбцы заполняют автомат c с помощью SQL, в операторе Insert удалить id столбец и попробуйте снова.

Или установите идентификацию, но это не очень хорошая идея. Позволяет вставлять явные значения в столбец идентификаторов таблицы.

SET IDENTITY_INSERT Users ON

Например:

USE AdventureWorks2012;  
GO  
-- Create tool table.  
CREATE TABLE dbo.Tool(  
   ID INT IDENTITY NOT NULL PRIMARY KEY,   
   Name VARCHAR(40) NOT NULL  
);  
GO  
-- Inserting values into products table.  
INSERT INTO dbo.Tool(Name)   
VALUES ('Screwdriver')  
        , ('Hammer')  
        , ('Saw')  
        , ('Shovel');  
GO  

-- Create a gap in the identity values.  
DELETE dbo.Tool  
WHERE Name = 'Saw';  
GO  

SELECT *   
FROM dbo.Tool;  
GO  

-- Try to insert an explicit ID value of 3;  
-- should return an error:
-- An explicit value for the identity column in table 'AdventureWorks2012.dbo.Tool' can only be specified when a column list is used and IDENTITY_INSERT is ON.
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel');  
GO  
-- SET IDENTITY_INSERT to ON.  
SET IDENTITY_INSERT dbo.Tool ON;  
GO  

-- Try to insert an explicit ID value of 3.  
INSERT INTO dbo.Tool (ID, Name) VALUES (3, 'Garden shovel');  
GO  

SELECT *   
FROM dbo.Tool;  
GO  
-- Drop products table.  
DROP TABLE dbo.Tool;  
GO
...