【问题标题】:Spring JPA difficult deleteSpring JPA 难删除
【发布时间】:2021-01-19 16:14:38
【问题描述】:

有人可以帮助以下模型,已实现,但无法根据需要删除

  1. 用 Book 创作 OneToMany
  2. 按类型预订 ManyToMany
  3. 书籍类型多对多 我可以创建数据库并添加记录。我认为我的级联指定是错误的,因为我无法执行以下操作
  4. 从作者那里删除一本书(奇怪,版权问题:)已将其从 Books 中删除,但也已从 Genre 中删除 问题取决于我在删除流派时违反 FK 或在删除图书时违反 FK 的级联。是死锁吗?这是一个微不足道的模式,必须是可解决的。谢谢

【问题讨论】:

  • 在没有级联的情况下开始,也许永远不会将其添加回来。使用服务层并仔细执行您需要执行的操作。此外,作者和书籍应该是多对多的吗?

标签: jpa spring-data-jpa


【解决方案1】:

最终我认为级联最适合处理删除所有子关系的情况,但我仍然认为这是一个复杂的注释,大多数人都不太了解。我认为如果Book实体拥有作者和流派关系,那么ORM别无选择,只能在删除一本书时删除关系。

当我设置一个简单的 springboot 项目时,它似乎可以解决所有这些问题。

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Author {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
    @ManyToMany(mappedBy = "authors")
    @lombok.ToString.Exclude
    private Set<Book> books;
}

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Genre {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToMany(mappedBy = "genres")
    @lombok.ToString.Exclude
    private Set<Book> books;
}

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Book {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToMany
    private Set<Author> authors;
    @ManyToMany
    private Set<Genre> genres;
}

还有一个简单的例子:

Author author = authorRepository.save(Author.builder().build());
Genre genre = genreRepository.save(Genre.builder().build());
Book book = bookRepository.save(Book.builder().authors(Collections.singleton(author)).genres(Collections.singleton(genre)).build());
System.out.println(book);
bookRepository.delete(bookRepository.getOne(book.getId()));

日志似乎表明,当一本书被删除时,作者和流派被清理了。

Hibernate: insert into author (id) values (null)
Hibernate: insert into genre (id) values (null)
Hibernate: insert into book (id) values (null)
Hibernate: insert into book_authors (books_id, authors_id) values (?, ?)
Hibernate: insert into book_genres (books_id, genres_id) values (?, ?)
Book(id=1, authors=[Author(id=1)], genres=[Genre(id=1)])
Hibernate: select book0_.id as id1_1_0_ from book book0_ where book0_.id=?
Hibernate: delete from book_authors where books_id=?
Hibernate: delete from book_genres where books_id=?
Hibernate: delete from book where id=?

我认为这就是你所质疑的。

【讨论】:

  • 哇。多么专业和简洁的答案,ty。那里有几种可教的技术。您的 lombok.ToString.Exclude 我发现不太需要 JsonBackReference。
  • 是的,lombok.EqualsAndHashCode.Exclude 也应该排序。见Lombok & Hibernate: How to Avoid Common Pitfalls
猜你喜欢
  • 2019-08-12
  • 2020-11-08
  • 2014-11-16
  • 2019-08-14
  • 1970-01-01
  • 2016-05-27
  • 2016-02-14
  • 2011-07-17
  • 2016-12-07
相关资源
最近更新 更多