Удаление объекта из отношения ManyToOne не обновляет родительскую коллекцию - PullRequest
2 голосов
/ 19 июня 2011

У меня есть отношения ManyToOne между Родителем и Ребенком. Я хочу удалить несколько дочерних объектов, которые отвечают на определенный запрос. Проблема в том, что после выполнения запроса на удаление, Parent.getChildren () по-прежнему возвращает удаленные дочерние элементы.

Разве я не могу использовать запросы удаления в таком случае?

@Entity
@Table(name = "CHILD_DATA")
public class Child {
    private Parent parent;
}


@Entity
@Table(name = "PARENT")
public class Parent{

    private Set<Child> children;

    @Column(name = "CHILDREN")
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    public Set<Child> getChildren() {
        return children;
    }

}

public class ChildDAO{

     public int removeServiceFrontPageData(Parent parent, long serviceID){
            String query = "DELETE FROM Child WHERE parent =:parent";
            Query q = em.createQuery(query);
            q.setParameter("parent", parent);
             return q.executeUpdate();
        }
}

Чтобы обновить родительский объект, я использую следующую функцию:

public class ParentDAO{

    public Parent getParent(String parentID){
        final String select = "FROM Parent WHERE parentID = :parentID";
        Query q = em.createQuery(select);
        q.setParameter("parentID", parentID);
        if(q.getResultList().isEmpty()){
            return null;
        }
        return (Parent) q.getSingleResult();
    }

}

спасибо

1 Ответ

5 голосов
/ 20 июня 2011

Мое решение основано на другой записи

Я нашел 2 способа решить эту проблему:

1) обновить родителя, если я удаляю детей:

  • выберите дочерние объекты, которые должны быть удалены.
  • удалить эти объекты из parent.getChildren ()
  • удалить детей из базы данных

2) добавить флаг orphanRemoval = true для parent.getChildren (). Удаление детей из набора удалит их из базы данных

@Entity
@Table(name = "PARENT")
public class Parent{

    private Set<Child> children;

    @Column(name = "CHILDREN")
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    public Set<Child> getChildren() {
        return children;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...