私のプロジェクトでは、私はUserエンティティとUserRoleエンティティを持っています。 私のデータベース設計によれば、ユーザーは複数の役割を果たし、役割は複数のユーザーに関連付けることができます。私のシステムで持っているユーザーの役割は、USERとADMINです。User、UserRoleのデータベース設計 - 多対多の関係
ユーザーの役割がテーブルに格納される必要があり、ユーザーが関連するテーブルに保持されているときに参照する必要があります。
しかし、私が実装したコードによれば、ユーザーをデータベースに挿入するたびにレコードがユーザーロールテーブルに挿入されることがあります。私が必要とするのは、UserテーブルとJoinテーブルにデータを挿入することです。
これは私のエンティティです。
ユーザー:
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable= false)
private Long id;
@Column(name = "email", nullable = false, unique = true)
private String email;
@Column(name = "first_name", nullable = false)
private String firstName;
@Column(name = "last_name", nullable = false)
private String lastName;
@Column(name = "password_hash", nullable = false)
private String passwordHash;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "user_with_role",
joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")})
private List<UserRole> roles;
}
のUserRole:
@Entity
@Table(name = "userrole")
public class UserRole {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable= false)
private long id;
@Column(name = "role_name")
@NotNull
@Enumerated(EnumType.STRING)
private Role roleName;
@ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY)
private List<User> users;
}
これは、私は、データベースにユーザーを保持する方法です。
List<UserRole> roles = new ArrayList<>();
UserRole ur_user = new UserRole();
ur_user.setRoleName(Role.USER);
UserRole ur_admin = new UserRole();
ur_user.setRoleName(Role.ADMIN);
roles.add(ur_user);
roles.add(ur_admin);
newUser.setRoles(roles);
entityManager.persist(newUser);
entityManager.flush();
このメカニズムは、関連エンティティを親エンティティとともにデータベースに入力する必要がある場合に適しています。 (例:従業員の連絡先)
私の状況では、ユーザーが永続化されたときにUserRoleテーブルに挿入しないようにコードを記述する方法を理解できません。
どのように私の状況でコードを書くべきですか? さらに、UserエンティティでCascadeTypeを使用する必要があることを知りたいと思います。私はCascadeType.ALL
を入れましたが、それは文脈に従ってその場所で最高のタイプではないことを知っています。