我的方案是一个应该获得新角色或失去新角色的用户。我不想为用户创建一个RelationEntitiy,应该将角色直接添加到用户,然后通过Spring Data Repository保存。
我的数据库架构:
我在用户实体中的休眠关系:
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "user_role",
joinColumns = {@JoinColumn(name = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "role_id")})
@Fetch(value = FetchMode.SELECT)
private Set<Role> roles;
但是当我尝试以这种方式更新它时:
User user = new User("hansmeier", "password", "Hans", "Meier",
"hansimeier@gmx.net", "+4915465656", roleRepository.findByName(Role.USER).orElse(null));
userRepository.save(user)
它也尝试在数据库中创建角色,但是它已经存在,从而导致错误。
org.springframework.dao.InvalidDataAccessApiUsageException:
detached entity passed to persist: app.model.Role; nested exception is
org.hibernate.PersistentObjectException: detached entity passed to persist:
app.model.Role
答案 0 :(得分:1)
您的代码未在事务中运行。
您必须添加@Transactional,以确保角色的获取和保存在同一事务中运行:
@Transactional
public void yourMethodName() {
User user = new User("hansmeier", "password", "Hans", "Meier",
"hansimeier@gmx.net", "+4915465656",
roleRepository.findByName(Role.USER).orElse(null));
userRepository.save(user);
}