Hibernate: Обновление одного списка - PullRequest
4 голосов
/ 20 сентября 2010

У меня есть однозначное отношение в Hibernate:

@Entity 
public class Project
    @OneToMany(cascade = CascadeType.ALL)
    @OrderColumn(name = "project_index")
    List<Application> applications;


@Entity
public class Application

Теперь я попытался обновить приложение напрямую:

    session.merge(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 Ответ

2 голосов
/ 20 сентября 2010

Когда вы вызываете session.merge(), он возвращает объект, который является значением этой сущности в контексте текущего сеанса.Вы не можете просто повторно использовать существующий объект в новом сеансе, потому что объект находится за пределами срока его сеанса (и новый объект, представляющий ту же сущность, возможно, уже был создан в новом сеансе).Вы должны соблюдать семантику hibernate для одного экземпляра на сущность на сеанс, используя новый объект вместо старого.

Если вы обнаружите, что вызов merge() приводит к созданию новой сущности (оператор вставки генерируется при сбрасывании), это может означать, что идентификатор объекта, который вы пытаетесь объединить, не совпадает, или есть проблема с вашей реализацией equals() или hashCode().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...