如何使用休眠方式更新实体 [英] How to update entity using hibernate
问题描述
我有实体用户:
@Entity
@Table(name = "entity_user")
@AttributeOverride(name = "id", column = @Column(name = "user_id"))
public class User extends BaseObject implements Serializable {
/**
* Login, unique
*/
private String email;
private String username;
/**
* Secret for signing-in
*/
private String password;
/**
* Type of user
*/
private UserType userType;
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@JoinTable(name = "view_user_to_requestSet", joinColumns = {
@JoinColumn(name = "user_id")}, inverseJoinColumns = {
@JoinColumn(name = "requestSet_id")})
private Set<RequestSet> setOfRequesSet = new HashSet<>();
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@JoinTable(name = "view_user_to_requestSetCreator", joinColumns = {
@JoinColumn(name = "user_id")}, inverseJoinColumns = {
@JoinColumn(name = "requestSet_id")})
private Set<RequestSet> setOfRequesSetCreator = new HashSet<>();
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@JoinTable(name = "view_user_to_userTask", joinColumns = {
@JoinColumn(name = "user_id")}, inverseJoinColumns = {
@JoinColumn(name = "userTask_id")})
private Set<UserTask> setOfUserTask = new HashSet<>();
public User() {
}
.
.
..... GET AND SET
基础对象是: @MappedSuperclass 公共类BaseObject {
Base object is: @MappedSuperclass public class BaseObject {
@Id
@GeneratedValue
@Column(name = "entity_id")
private Long id;
/**
*
* @return true if the entity hasn't been persisted yet
*/
@Transient
public boolean isNew() {
return id == null;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
问题是,当我尝试更新对象时,出现错误:
The proble is, when I try to UPDATE object, I am getting errors:
Exception in thread "Thread-15" org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [UK_5fa729oayn43ynq4v2y4d9qcn]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '5' for key 'UK_5fa729oayn43ynq4v2y4d9qcn'
对于我正在使用的更新实体:
For update entity I am using:
@Transactional
public void save(User value){
em.merge(value);
}
我不知道为什么会收到此错误,如何更新对象?谢谢您的帮助.
I am dont know why I am getting this error, how can I update my object? Thank you for your help.
我更新:
User u = em.find(persistedType, id); //get user by ID
u.getSetOfRequesSet().add(requestSet); //add one otem to set
userDap.merge(u); //save
推荐答案
看起来您的更新重复了集合中的条目(em.merge). 为了防止重复,您应该显式合并集合.请执行以下操作.
It looks like your update duplicates entries in the set (em.merge). To prevent the duplication you should merge set explicitly. Do as following.
-
添加方法合并到用户:
Add method merge to User:
protected User merge(User other) {
// Just assign all data members(2 examples here)
setEmail(other.getEmail());
....
setSetOfRequesSet(other.getSetOfRequesSet());
...
}
准备一个更新的对象实例:
Prepare an updated object instance:
User updated = em.find(persistedType, id); //get user by ID
updated.getSetOfRequesSet().add(requestSet); //add one item to set
更新现有的数据库实体:
Update the existing db entity:
User existing = em.find(persistedType, id);
existing.merge(updated);
更新后无需校准即可合并,因为保存只会在事务结束时进行.
Not necessary to cal to em.merge after the update, since save will be just done at the end of a transaction.
您可以在此处找到说明
这篇关于如何使用休眠方式更新实体的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!