【发布时间】:2018-09-21 10:08:22
【问题描述】:
我在 Spring Boot 中使用 JPA。我是 JPA 的新手。
我有两个实体
User.java
@Entity
@Table(name = "user")
@Data
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;
@Column(unique = true, name = "username")
@NotNull
private String username;
@NotNull
@Column(name = "password")
private String password;
@Column(name = "display_name")
private String displayName;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "user_roles_rel", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "role_id"))
private Set<Role> roles;
@Column(name = "profile_picture_path")
private String profilePicturePath;
}
Role.java
@Entity
@Table(name = "roles")
@Data
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "role_id")
private long id;
@Column(name = "role", unique = true)
private String role;
}
我的要求是我的应用程序将只有 5 个角色,但成千上万的用户拥有这五个角色中的任何一个。当我添加一个新用户时,应该为该用户添加这些角色中的任何一个。每次添加新用户时,上面的代码都会插入一个新角色。如何添加具有现有角色的用户?
这是用于添加新用户的 JSON 数据
{
"username":"username",
"password":"password",
"roles":[
{
"role_id":1
}
],
"displayName":"Dispaly Name",
"profilePicturePath":"abc.png"
}
这里我已经在数据库中添加了一个角色 id : 1
当我添加此用户时,我希望插入角色 id 为 1 的用户。
RoleRepository.java
public interface RoleRepository extends JpaRepository<Role, Long> {
public Role findByRole(String role);
}
UserRepository.java
public interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String username);
}
UserService.java
@Service
public class UserService{
@Autowired
UserRepository userRep;
public void addUser(User user) {
user.setPassword(passwordEncoder().encode(user.getPassword()));
userRep.save(user);
}
}
UserController.java
@PostMapping(path = "/api/user/new_user_without_image")
public ResponseMessage addUserWithoutImage(@RequestBody User user) {
userService.addUser(user);
return new ResponseMessage("The User was added successfully!");
}
【问题讨论】:
-
请提供DAO的代码
-
已更新。请看一下
-
插入方法在哪里?
-
在调用插入之前打印
Role对象,并检查它们的id字段是否填写正确。角色字段上的CascadeType.ALL也是错误的,因为您的角色表基本上是一个字典,它不需要持久化(Cascade.ALL 包括持久化)。
标签: java json spring-boot spring-data-jpa