Hibernate OneToMany Ошибка при добавлении второй записи - PullRequest
1 голос
/ 11 марта 2019

Я занимаюсь разработкой весеннего загрузочного приложения с использованием базы данных hibernate и H2. После того, как я создаю приложение, приложение создает таблицы, как я и ожидал. После создания таблиц я добавил роль в таблицу ролей вручную (role_id = 1, role = "USER"), после чего запускаю приложение. Я мог бы успешно добавить первого пользователя с ролью USER, но при попытке добавить вторую запись я получаю сообщение об ошибке. Кроме того, я добавляю еще одну роль (role_id = 2, role="ADMIN") после того, как смогу успешно добавить первого пользователя с ролью ADMIN. Но второй не смог. Почему я не могу добавить записи более одной?

Ошибка

* не удалось выполнить оператор; SQL [н / п]; ограничение [\ "UK_IT77EQ964JHFQTU54081EBTIO_INDEX_B ON PUBLIC.USER_ROLE (ROLE_ID) VALUES (2, 1) \ "; оператор SQL: \ ninsert into user_role (user_id, role_id) значения (?,?) [23505-197]]; вложенное исключение org.hibernate.exception.ConstraintViolationException: не удалось выполнить оператор.

Вот мои блоки кода.

User.java

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

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

    private String name;

    @Column(unique = true)
    private String username;

    @JsonProperty(access = Access.WRITE_ONLY)
    private String password;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private List<Role> roles = new ArrayList<>();
}

Role.java

@Entity
@Table(name = "role")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "role_id")
    private int roleId;

    @Column(name = "role")
    private String role;

    public Role() {
    }

    public Role(String role) {
        this.role = role;
    }
}

Метод регистрации

@RequestMapping(value = "/register", method = RequestMethod.POST)
public ResponseEntity<User> createUser(@RequestBody User user){
    if(userRepository.findByUsername(user.getUsername()) != null) {
        throw new RuntimeException("Username already exist");
    }   

    List<Role> roles = new ArrayList<>();
    roles.add(roleRepository.findByRole("USER"));
    user.setRoles(roles);

    return new ResponseEntity<User>(userRepository.save(user), HttpStatus.CREATED);
}

Таблицы базы данных

CREATE CACHED TABLE PUBLIC.USER_ROLE( 
USER_ID INTEGER NOT NULL, 
ROLE_ID INTEGER NOT NULL 
);


CREATE CACHED TABLE PUBLIC.USER( 
    USER_ID INTEGER DEFAULT (NEXT VALUE FOR 
PUBLIC.SYSTEM_SEQUENCE_2149846F_F3B8_4E83_9B93_C1C67BF9DEA9) NOT NULL 
NULL_TO_DEFAULT SEQUENCE 
PUBLIC.SYSTEM_SEQUENCE_2149846F_F3B8_4E83_9B93_C1C67BF9DEA9, 
    NAME VARCHAR(255), 
    PASSWORD VARCHAR(255), 
    USERNAME VARCHAR(255) 
);

CREATE CACHED TABLE PUBLIC.ROLE( 
    ROLE_ID INTEGER DEFAULT (NEXT VALUE FOR 
PUBLIC.SYSTEM_SEQUENCE_44142DBD_5E4A_4D30_AB39_36956E6C6DAF) NOT NULL 
NULL_TO_DEFAULT SEQUENCE 
PUBLIC.SYSTEM_SEQUENCE_44142DBD_5E4A_4D30_AB39_36956E6C6DAF, 
    ROLE VARCHAR(255) 
);
...