java - Spring Data 更新多对一属性

标签 java spring hibernate spring-mvc jpa

我在 Spring Data JPA 中保存多对一字段时遇到问题。
考虑实体用户和组,如下所述:

    @Entity
    @Table(name = "Users")
    public class User {
        @Basic(optional = false)
        @Column(name = "username")
        private String username;

        @JoinColumn(name = "group_id", referencedColumnName = "id")
        @ManyToOne
        private Group group;
    }

    @Entity
    @Table(name = "groups")
    public class Group {
       @Basic(optional = false)
       @Column(name = "name")
       private String name;

       @OneToMany(mappedBy = "group",cascade=CascadeType.PERSIST)
       private Collection<User> userCollection;
    }

当我想更新用户实体并使用 CrudRepository 保存方法更改其组时发生以下异常:
org.hibernate.HibernateException: Group 实例的标识符从 2 更改为 1 和 显示 spring 数据想要编辑 Group 的 id 字段,而它不正确且 我想更改它的引用而不是它的 ID .

对于更新,我以 DTO 形式获取 View 数据,然后我使用 Dozer Mapper 将 dto 对象转换为实体对象,如下所述:
DozerBeanMapper mapper = new DozerBeanMapper();
// get user by id from database for editing
User user = this.userService.findByIdAndDeletedFalse(form.getId());
// merge view data and entity data using Dozer
mapper.map(form, user);
// save User entity
this.userService.save(user);

userService 是一个仅调用 crudRepository 保存方法的 bean。

任何解决方案?

谢谢

最佳答案

发生错误是因为您试图更改 id跟踪的实体,这在 JPA 中是不允许的。您需要获得对新 Group 的引用并将其分配给 User.group .

简而言之,而不是这样:

user.getGroup().setId(newId);

尝试这个:
user.setGroup(entityManager.getReference(Group.class, newId)); 

关于java - Spring Data 更新多对一属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42192231/

相关文章:

java - 检查前两位数字是否在 00 && 99 之间

java - Spring 4 @controller 配置

java - 我是否需要在 DAO 实现中使用 setter 或构造函数

java - 使用 AppiumDriver 截图时获取浏览器无法访问异常

java - java线程在下面的场景中将如何工作?

java - 多层企业应用程序中的 NBP 富客户端?

java - 登录表单 : @RequestMapping cannot handle the POST request

java - 如何使用 spring 和 hibernate 在我的类(class)中获取 session 工厂

hibernate - 元素类型 "id"的内容必须匹配 "(meta*,column*,type?,generator?)")

java - try-with-resources 中的 ObjectOutputStream