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