休止状態と H2 データベースを使用してスプリング ブート アプリケーションを開発しています。アプリケーションを作成すると、アプリケーションは期待どおりにテーブルを作成します。テーブルを作成した後、手動でロール テーブルにロールを追加し ( role_id = 1, role = "USER")、アプリケーションを実行しました。ロールが USER である最初のユーザーを正常に追加できましたが、2 番目のレコードを追加しようとするとエラーが発生します。role_id = 2, role="ADMIN"また、役割が ADMIN である最初のユーザーを正常に追加できた後、別の役割 ( ) を追加します。しかし、2番目のものはできませんでした。複数のレコードを追加できないのはなぜですか?
エラーは
*ステートメントを実行できませんでした; SQL [該当なし]; 制約 [\"UK_IT77EQ964JHFQTU54081EBTIO_INDEX_B ON PUBLIC.USER_ROLE(ROLE_ID) VALUES (2, 1)\"; SQL ステートメント:\nuser_role (user_id, role_id) 値 (?, ?) [23505-197]] に挿入; ネストされた例外は org.hibernate.exception.ConstraintViolationException: could not execute statement です。
これが私のコードブロックです。
の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)
);