是否可以使用@manytomany关系仅关联数据库中已经存在的对象?

时间:2019-12-27 08:27:59

标签: hibernate spring-data

我的方案是一个应该获得新角色或失去新角色的用户。我不想为用户创建一个RelationEntitiy,应该将角色直接添加到用户,然后通过Spring Data Repository保存。

我的数据库架构:

enter image description here

我在用户实体中的休眠关系:

@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

1 个答案:

答案 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);
}