Spring JPA难以删除

Spring JPA难以删除,jpa,spring-data-jpa,Jpa,Spring Data Jpa,是否有人可以帮助实现以下模型,但无法根据需要删除 作者与书的关系 书有很多种体裁 书的种类很多 我可以创建数据库并添加记录。我相信我的级联指定是错误的,因为我不能做以下事情 从作者那里,删除一本书(是的,奇怪,版权问题:),从书中删除它,但也从体裁中删除它 这个问题取决于我在流派删除时得到的FK冲突或在书籍删除时得到的FK冲突。这是僵局吗?这是一个微不足道的模式,必须可以解决。多谢各位 最终,我认为cascade最好用于处理删除所有子关系的情况,但我仍然认为它是一个复杂的注释,大多数人并不理解。

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

  • 作者与书的关系
  • 书有很多种体裁
  • 书的种类很多 我可以创建数据库并添加记录。我相信我的级联指定是错误的,因为我不能做以下事情
  • 从作者那里,删除一本书(是的,奇怪,版权问题:),从书中删除它,但也从体裁中删除它 这个问题取决于我在流派删除时得到的FK冲突或在书籍删除时得到的FK冲突。这是僵局吗?这是一个微不足道的模式,必须可以解决。多谢各位

  • 最终,我认为cascade最好用于处理删除所有子关系的情况,但我仍然认为它是一个复杂的注释,大多数人并不理解。我认为,如果
    图书
    实体拥有作者和流派关系,那么ORM别无选择,只能在图书被删除时删除这些关系

    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=?
    
    当我设置一个简单的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;
    }
    
    这些日志似乎表明,当一本书被删除时,作者和流派都被清除了

    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=?
    

    我认为这正是你的问题所在。

    在没有级联的情况下开始,也许永远不要再添加级联。使用一个服务层,仔细地做你需要做的事情。此外,作者和书应该是很多的吗?哇。多么专业和简洁的回答啊,泰。这里有几种可教的技巧。我发现你的lombok.ToString.Exclude不太需要JsonBackReference。是的,
    lombok.EqualsAndHashCode.Exclude
    也应该排序。看见