2014-10-23 3 views
0

부모 개체에서 CascadeType.ALL을 가진 자식 목록까지 매우 단순한 단방향 @OneToMany가 있습니다. 자녀를 올바르게 제거하고 삭제하는 방법은 무엇입니까?최대 절전 모드 @OneToMany에서 하위 항목을 올바르게 삭제하는 방법은 무엇입니까?

List에서 remove (하위)를 호출하고 session.saveOrUpdate (상위)를 호출하면 물론 작동하지 않고 하위 제거를 지정하지 않으면 하위가 데이터베이스에서 삭제되지 않습니다.

고아 제거에 대한 대안으로, 내가 session.delete (자식)가 DB에서 삭제 한 다음 (자식)을 목록에서 제거하고 그 다음에 session.refresh (부모) 그래서 내 부모 객체는 메모리에 올바른 상태가 있습니까?

자식을 올바르게 제거하고 고아 제거없이 데이터베이스에서 삭제 한 방법은 무엇입니까? 나는 현재 내 ParentDao 이것에 대해 생각하고

은 : (최대 절전 모드에서)

이 지역 @Cascade (DELETE_ORPHAN)를 할 예정으로
public void removeChild(Parent parent, Child child) { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Transaction tx = null; 
    try { 
     session.beginTransaction(); 

     session.delete(child); 

     session.getTransaction().commit(); 

     parent.getChildren().remove(child); 
     session.refresh(parent); 
    } catch (RuntimeException e) { 
     if (tx != null) { 
      tx.rollback(); 
     } 
     throw e; 
    } finally { 
     session.close(); 
    } 
} 

답변

2

수동으로, 여기에 거의 동일한 동작을 수행하는 코드입니다 .

엔티티 :

class Library { 

    @Id 
    private Integer id; 

    @OneToMany 
    private List<Book> books; 

    // getters and setters  
} 

class Book { 

    @Id 
    private Integer id; 

    @ManyToOne 
    private Libraby library; 

    // getters and setters 
} 

그리고 간단한 예 :

session.beginTransaction(); 

// load a library with ID = 1 
Library library = session.get(Library.class, 1); 

// assuming that your library has two books 
Book book = library.getBooks().get(0); //gets the first book 
library.getBooks().remove(0); // Remove this book from the library 
session.delete(book); 

session.getTransaction().commit(); 

그리고 당신의 책은 데이터베이스와 인접 해 부모가도 업데이트됩니다 lisf에서 삭제됩니다.

+0

실제로 내 주요 질문은 : 수동으로, DELETE_ORPHAN없이 어떻게합니까? – karrjin

+0

죄송합니다.하지만 수동으로해야하는 이유는 무엇입니까? – leozin

+0

나는 그것을 더 잘 이해하려고 노력하고있다. – karrjin

0

아래 코드를 사용해 볼 수 있습니까? 커밋 전에 목록에서 제거 중입니다.

public void removeChild(Parent parent, Child child) { 
    Session session = HibernateUtil.getSessionFactory().openSession(); 
    Transaction tx = null; 
    try { 
     session.beginTransaction(); 

     parent.getChildren().remove(child); 
     session.delete(child); 

     session.getTransaction().commit(); 


     // session.refresh(parent); // this is not required 
    } catch (RuntimeException e) { 
     if (tx != null) { 
      tx.rollback(); 
     } 
     throw e; 
    } finally { 
     session.close(); 
    } 
} 
+0

고마워! 하지만 새로 고치지 않으면 (부모) 새 자식을 추가하고 saveOrUpdate (부모)를 다시 호출하면 org.hibernate가 생깁니다.StaleStateException : 일괄 업데이트가 update [0]의 예기치 않은 행 수를 반환했습니다. 실제 행 수 : 0; 예상 : 1 그래서 전에 refresh()를 호출해야한다고 생각합니다. 컬렉션에서 삭제 된 개체를 제거하는 것만으로는 충분하지 않습니다. – karrjin

+0

새로 고친 후 작동합니까? – javafan