gpt4 book ai didi

java - Hibernate 如何正确删除@OneToMany 中的子项?

转载 作者:行者123 更新时间:2023-12-02 05:20:50 24 4
gpt4 key购买 nike

我有一个非常简单的单向@OneToMany,从父对象到CascadeType.ALL 的子对象列表。我如何正确移除和删除其中一个子项?

简单地在列表上调用remove(child),然后调用session.saveOrUpdate(parent)当然不起作用,除非我指定孤立删除,否则子级不会在数据库中删除。

作为孤儿删除的替代方法,如果我 session.delete(child) 在数据库中删除它,然后从列表中删除(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();
}
}

最佳答案

当您要手动执行 @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();

您的图书将从数据库中删除,并且父图书的列表也会更新。

关于java - Hibernate 如何正确删除@OneToMany 中的子项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26532275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com