gpt4 book ai didi

java - Hibernate 无法更新对象

转载 作者:搜寻专家 更新时间:2023-11-01 03:49:34 26 4
gpt4 key购买 nike

我正在使用 hibernate 的 EntityManager 来保存一个对象,然后更新它。我的代码看起来像:

@PersistenceContext(unitName = "demoPU")
private EntityManager em;

E e = new E();
e.setDescription("Description");

e = em.merge(e);
em.flush();

e.setDescription("newDescription");
e = em.merge(e);
em.flush();

类E的Id是使用@PrePersist生成的。

hibernate 日志看起来像这样:

Hibernate: insert into E (Description, ID) values (?, ?, ?)
Hibernate: insert into E (Description, ID) values (?, ?, ?)

所以基本上 hibernate 试图用相同的 ID 插入相同的对象两次。这反过来又给出了以下异常:

org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation; SYS_PK_10253 table: POLICY

有人可以告诉我为什么 hibernate 运行 insert 语句而不是 update 即使我正在使用实体管理器 merge 来保存并更新对象?另外,在这种情况下我如何实际更新对象?

编辑:E 类看起来像:

@Entity
@Table(name = "E")
public class E {

@Id
@Column(name="ID",nullable = false)
private String id;

@Basic(optional = false)
@Column(name = "Description", nullable = false)
private String Description;

// Getters setters etc

public String getId(){
if(this.id == null ){
this.setId(UUID.randomUUID().toString());
}
return id;
}


@PrePersist
private void verifyPrimaryKeyAssigned(){
getId();
}

@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
Policy other = (Policy) obj;
if (getId() == null) {
if (other.getId() != null)
return false;
} else if (!getId().equals(other.getId()))
return false;

return true;
}
}

最佳答案

如果您想第一次持久化实体,我认为使用“持久化”而不是“合并”会更清楚。

在您的示例中,无需调用“合并”两次,因为您从第一次合并中取回了一个托管实体,并且您正在更改从合并中取回的实体,您的更改将在事务提交时自动保留。

关于java - Hibernate 无法更新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32065344/

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