在我的項目中,我有一個用戶實體和一個UserRole實體。 根據我的數據庫設計,用戶可以扮演多個角色,角色可以與多個用戶相關聯。我在系統中的用戶角色是USER和ADMIN。用戶,UserRole的數據庫設計 - 多對多關係
需要將用戶角色存儲在表中,並且需要在用戶保留在相關表中時引用它們。
但是,根據我實現的代碼,每次將用戶插入數據庫時,記錄都會插入到用戶角色表中。我需要的是將數據插入到用戶表和連接表中。
這些是我的實體。
用戶:
@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表中。
如何在我的情況下編寫代碼。 另外,我想知道我應該在用戶實體中使用CascadeType。我已經把CascadeType.ALL
,但我知道這不是根據上下文在那個地方最好的類型。