gpt4 book ai didi

java - Spring Data 更新多对一属性

转载 作者:行者123 更新时间:2023-12-01 14:34:36 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com