当前位置: 首页 > 知识库问答 >
问题:

Spring JPA-删除One-toMany关系中的子级

通寂离
2023-03-14

我有以下作者类:

@Entity
public class Author  implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(fetch = FetchType.EAGER, cascade=CascadeType.ALL)
    @JoinTable(
        name="author_book",
        joinColumns = @JoinColumn( name="author_id"),
        inverseJoinColumns = @JoinColumn( name="book_id")
    )
    private Set<Book> books= new HashSet<Book>();

    public Author() {
        super();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Set<Book> getBooks() {
       return books;
    }

    public void setBooks(Set<Book> books) {
        this.books = books;
    }
 }
@Entity
public class Book implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private Long id;

    public Book() {
        super();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

}
public interface BookRepository extends CrudRepository<Book, Long> {
}
public interface AuthorRepository extends CrudRepository<Author, Long>{
}
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class AuthorRepositoryIntegrationTests {

    @Autowired
    AuthorRepository authorRepository;
    @Autowired
    BookRepository bookRepository;

    @Test
    @Transactional
    public void deleteBookFromAuthor() {
        Book book= new Book();
        Author author= new Author();
        author.getBooks().add(book);
        author=this.authorRepository.save(author);

        Iterable<Author> authors = this.authorRepository.findAll();
        author=authors.iterator().next();
        book=author.getBooks().iterator().next();
        this.bookRepository.delete(book);

        authors = this.authorRepository.findAll();
        assertEquals(authors.iterator().next().getBooks().size(),0);
    }
}

我的问题是这个测试用例中的最后一个断言失败了。如果我向作者添加一本书,它就会自动添加到图书存储库中。但是如果我从存储库中移除一本书,我如何从作者那里移除它呢?

共有1个答案

越飞语
2023-03-14

好吧,对不起,我没有仔细看你的问题。答案很简单,这次我真的尝试了。您需要从POJO中的父级中删除子级,并在没有子级的情况下重新保存父级。请参阅下面的注释代码:

List<Book> books = new ArrayList<Book>();

Book book = new Book();
books.add(book);

Author author = new Author();
author.setBooks(books);
authorRepository.save(author);

Author a =authorRepository.findAll().iterator().next();
Book b = a.getBooks().get(0);
bookRepository.delete(b);

// REMOVE FROM PARENT
a.getBooks().remove(0);
authorRepository.save(a);

a = authorRepository.findAll().iterator().next();
System.out.println(a);

编辑:如果您担心一致性(应该如此),只需从author POJO中删除这本书,保存author时,cascade=cascadeType.all将为您传播删除这本书。例如:

Author a =authorRepository.findAll().iterator().next();
a.getBooks().remove(0);
authorRepository.save(a);

// NO BOOK
a = authorRepository.findAll().iterator().next();
System.out.println(a);
 类似资料:
  • 我目前正在阅读Hibernate关于实体关联的文档,我遇到了一些问题。它本质上与和关联之间的区别有关。尽管我在实际项目中使用过它们,但我无法完全理解它们之间的区别。根据我的理解,如果一个表/实体与另一个表或实体有关联,那么该关联应该来自另一方。那么,我们应该如何根据具体案例决定选择哪一个,以及它对数据库/查询/结果有何影响?到处都有好榜样吗? PS:我认为这将很有帮助,因为它与这个问题有关,如果有

  • 问题内容: 我有一个使用软删除的简单架构(这是设计方式,不能更改)。有参与模式两个表:和其中ofcourse是一个FK的表。规则是: 如果有,那么所有提到该公司的人都应该有。 但是,即使父母有,也可能有。 我的两个问题是:a)如何强制执行这些约束?b)如何最轻松地确保在软删除a时将其级联。 我添加了标签postgresql和sql server,因为它们是我最感兴趣的数据库。如果其他rdbms:e

  • 我试着在这里找到类似的问题,我在这里找到了这个,但它没有太大的帮助。 这正是我的问题所在。问题是@ondelete迫使我建立双向关系,对吗?如果可能的话,我想保持单向性。 L.E:我修改了我的处理程序方法,看起来像这样

  • 我正在使用Spring MVC/Security/JPA/Hibernate开发一个web应用程序。 我有一个用户类,它与UserRole有一个omany关系。 UserRole类与用户之间有很多关系。 用户存储库界面非常简单。 当我使用下面的代码片段使用存储库加载用户信息时,它会很好地检索用户和用户角色数据。 这是日志文件。 然而,问题出在这里。 如果我使用UserRepository的save

  • 问题内容: 我要删除具有多对多关系的一个站点上的表中的一行。我还想删除该关系另一侧的所有相关行。 例如,假设我有以下表格,并且想从中删除一行。我也想从中删除所有相关的行,当然,也删除其中不再需要的任何行。 我知道如何在查询中连接以上表格。但是我看不到如何删除整个关系中的数据。 注意:关系的两端都实现级联删除。因此,例如,从中删除行将删除中的任何相关行。但是显然,这不会传播到表中。 问题答案: 我认

  • 我在删除联接表中引用的实体时遇到问题。以下是三个链接的enitie。 当我尝试使用CrudRepository从来宾表中删除来宾时,它会给我这个错误。 错误:表“guest”上的更新或删除违反了表“guest\u group\u join”上的外键约束“FKKOUGVMCU860MOUACR1SHJXY”。键(id)=(4)仍然从表“guest\u group\u join”中引用。 有人能帮忙吗