在我的项目中,我有一个用户实体和一个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
,但我知道这不是根据上下文在那个地方最好的类型。