当用户在Spring Security中注册时,我正在尝试添加默认角色值。
我有两个模型“用户”和“角色”与多对多关系相关联。
User.java
@NotEmpty
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Role> roles = new HashSet<>();
Role.java
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(length=15, unique=true, nullable=false)
private String role = RoleType.USER.getRole();
data.sql
INSERT INTO ROLE(role) VALUES ('USER');
INSERT INTO USER(email,password) VALUES ('user@mail.com','user');
INSERT INTO USER_ROLES(user_id, roles_id) VALUES (1,1);
这里的想法是使用role_id来设置用户角色,但我更喜欢使用String来实现lisibility。像这样的一行或两行
INSERT INTO USER_ROLES(user_id, roles) VALUES (1, "ADMIN");
INSERT INTO USER_ROLES(user_id, roles) VALUES (1, "DBA");
此外,当我尝试从JAVA创建用户时,我需要使用角色dao来检索相应的ID,我希望默认情况下将新用户设置为“ROLE_USER”。
UserDBTest.java
@Before
public void setUp() {
User user = new User();
user.setEmail("email@mail.com");
user.setPassword("password");
user.addRole(roleRepository.findOne(1L)); //detached entity passed to persist
user = userRepository.save(user);
}
答案 0 :(得分:1)
您可以像这样编写SQL:
INSERT INTO USER_ROLES(user_id, roles)
VALUES (1, (SELECT id FROM roles WHERE role='ADMIN'));
您遇到的JPA错误是因为您没有在事务中运行。 例如,如果你使用TestNG,你可以让你的测试类扩展AbstractTransactionalTestNGSpringContextTests
,它会起作用。
更新:如果需要额外的数据库查找,可以选择将角色名称直接存储在USER_ROLES
表中,User.java将如下所示:
@ElementCollection
@Enumerated(EnumType.STRING)
private Set<RoleType> roles;
答案 1 :(得分:0)
如果要将Role
存储为字符串,则可以将其表示为Java中的枚举,并完全删除该表。
然后,您可以在@OneToMany
和User
之间将关系表示为UserRole
。
在UserRole.java
@ManyToOne
@JoinColumn(name = "user_id")
User user;
@Column(name = "role")
@Enumerated(EnumType.STRING) // this tells JPA to store enum name in db
Role role; //role enum