Hibernate:更新onetomany列表

时间:2010-09-20 09:12:52

标签: java hibernate orm

我在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();
}

1 个答案:

答案 0 :(得分:2)

当您调用session.merge()时,它会返回一个对象,该对象是当前会话上下文中该实体的值。您不能简单地在新会话中重用现有对象,因为该对象在其会话的生命周期之外(并且可能已经在新会话中创建了表示同一实体的新对象)。您需要通过使用新对象代替旧对象来尊重hibernate的每实体一个实例的语义。

如果您发现调用merge()会导致创建一个新实体(在flush上生成一个insert语句),这可能意味着您尝试合并的对象的标识符不匹配,或者您的equals()hashCode()实施存在问题。