我在Hibernate中有一个onetomany关系:
@Entity
public class Project
@OneToMany(cascade = CascadeType.ALL)
@OrderColumn(name = "project_index")
List<Application> applications;
@Entity
public class Application
现在,我尝试直接更新应用程序:
session.merge(application);
结果是创建了一个新的Application,而不是更新实体。如何正确地重新获取我的实体并更新我的实体?
谢谢
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Application)) {
return false;
}
Application app = (Application)obj;
return id == app.getId();
}
@Override
public int hashCode () {
return status.hashCode();
}
答案 0 :(得分:2)
当您调用session.merge()
时,它会返回一个对象,该对象是当前会话上下文中该实体的值。您不能简单地在新会话中重用现有对象,因为该对象在其会话的生命周期之外(并且可能已经在新会话中创建了表示同一实体的新对象)。您需要通过使用新对象代替旧对象来尊重hibernate的每实体一个实例的语义。
如果您发现调用merge()
会导致创建一个新实体(在flush上生成一个insert语句),这可能意味着您尝试合并的对象的标识符不匹配,或者您的equals()
或hashCode()
实施存在问题。