0

親オブジェクトから CascadeType.ALL を持つ子のリストへの非常に単純な単方向 @OneToMany があります。子の 1 つを正しく削除するにはどうすればよいですか?

もちろん、リストで remove(child) を呼び出してから session.saveOrUpdate(parent) を呼び出すだけでは機能せず、孤立した削除を指定しない限り、データベースで子は削除されません。

孤立した削除の代わりに、session.delete(child) で DB から削除してから、リストから remove(child) してから、session.refresh(parent) を実行する必要があるので、親オブジェクトメモリ内に正しい状態がありますか?

子を正しく削除し、孤児を削除せずにデータベースで削除するにはどうすればよいですか?

私は現在、私のParentDaoでこれについて考えています:

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

2 に答える 2

2

@Cascade(DELETE_ORPHAN) (Hibernate から) を手動で実行しようとしているので、ほとんど同じ動作をするコードを次に示します。

エンティティ:

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();

また、Book はデータベースから削除され、親のリストも更新されます。

于 2014-10-23T16:21:41.360 に答える
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();
    }
}
于 2014-10-23T17:49:59.637 に答える