【发布时间】:2015-09-11 07:14:33
【问题描述】:
我开始使用 Spring Data JPA 开发 Spring Boot 应用程序,以在用户和角色之间建立多对多关系。
这种关系在 User 类中定义如下:
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name="user_role", joinColumns = {@JoinColumn(name="user_id")}, inverseJoinColumns = {@JoinColumn(name="role_id")})
private Set<UserRole> roles;
我使用以下方法创建角色:
@Transactional
private void generateSeedRoles() {
UserRole adminRole = new UserRole(RoleEnum.ADMIN.toString());
userRoleRepository.save(adminRole);
UserRole userRole = new UserRole(RoleEnum.USER.toString());
userRoleRepository.save(userRole);
}
之后为用户分配角色失败:
@Transactional
private void generateSeedUsers() {
UserRole adminRole = userRoleRepository.findUserRoleByRoleName("ADMIN");
User user = User.createUser("user1", "user1@user.com", "pass");
user.setRoles(new HashSet<UserRole>(Arrays.asList(adminRole)));
userRepository.save(user);
}
抛出以下异常(为便于阅读而格式化):
org.springframework.dao.InvalidDataAccessApiUsageException:
detached entity passed to persist: co.feeb.models.UserRole;
nested exception is org.hibernate.PersistentObjectException:
detached entity passed to persist: co.feeb.models.UserRole
但是,如果在创建关系之前保存了用户,则可以正常工作:
@Transactional
private void generateSeedUsers() {
UserRole adminRole = userRoleRepository.findUserRoleByRoleName("ADMIN");
User user = User.createUser("user1", "user1@user.com", "pass");
//Save user
userRepository.save(user);
//Build relationship and update user
user.setRoles(new HashSet<UserRole>(Arrays.asList(adminRole)));
userRepository.save(user);
}
对我来说,必须两次保存/更新用户似乎有些不合理。有什么方法可以在不先保存用户的情况下将接收到的角色分配给新用户?
【问题讨论】:
-
您发布的代码似乎是正确的,除了by default, @Transactional does not work for private methods.你可以看到my sample 工作正常。事实上,我的猜测是,由于您遗漏了
CascadeType.PERSIST,因此您的用户没有获得任何角色,因为它既没有被合并也没有被分离。
标签: java spring hibernate jpa spring-data-jpa