【发布时间】:2017-06-30 17:46:26
【问题描述】:
我在 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 形式获取视图数据,然后使用 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。
有什么办法吗?
谢谢
【问题讨论】:
-
用户和组共享同一张表是否正确?
-
请附上更新相关代码。
-
亲爱的 al27091 这是一个错误
-
您可以在更新
User.group的位置添加代码吗?错误消息听起来好像您正在为Group实体设置一个新的id,而不是更改User中的引用 -
@crizzis 我将 user.group.id 更改为新选择的组 id,然后调用 save 方法。如果组为空,这对我来说很好,但是如果分配了一个组并且我想更改它,我将面临该异常。
标签: java spring hibernate spring-mvc jpa