【问题标题】:Spring boot: Deleting an entity in a many to many relationshipSpring boot:删除多对多关系中的实体
【发布时间】:2018-07-04 12:06:51
【问题描述】:

我正在使用 mysql,jpa 开发 Spring Boot 库应用程序。它有 2 个实体书,人。每个人可以带一本书以上,每本书可以由多个人带走(取决于可用的书籍副本)。 这是我的处理方法,

Book.java

@Entity
@Table(name="book")
public class Book {

    /*@Id
    @Column(name="bookId")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int bookId;*/

    @Id
    @Column(name="bookName")
    private String bookName;

    @Column(name="author")
    private String author;

    @Column(name="copiesTotal")
    private int    copiesTotal;

    @Column(name="copiesAvailable")
    private int    copiesAvailable;

    @ManyToMany(mappedBy="listOfBooks", cascade = CascadeType.ALL)
    private List<Person> listOfPersons = new ArrayList<Person>();

    public Book() {

    }

    public Book(String bookName, String author, int copiesTotal, int copiesAvailable) {
        super();
        //this.bookId = bookId;
        this.bookName = bookName;
        this.author = author;
        this.copiesTotal = copiesTotal;
        this.copiesAvailable = copiesAvailable;
        //this.people = people;

    }
//followed by getters and setters

Person.java

@Entity
@Table(name="person")
public class Person {

    @Id
    @Column(name="personId")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int personId;

    @Column(name="personName")
    private String personName;

    @Column(name="mobile")
    private String mobile;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name="book2persons",
        joinColumns=@JoinColumn(name="personId"),
        inverseJoinColumns=@JoinColumn(name="bookName"))
    private List<Book> listOfBooks = new ArrayList<Book>();

    public Person() {

    }

    public Person(int personId, String personName, String mobile) {
        super();
        this.personId = personId;
        this.personName = personName;
        this.mobile = mobile;

    }

当一个人借书时,他从下拉列表中选择现有的书,输入他的名字,手机并借书。

BookController.java //这里只展示部分代码

@RequestMapping(value="/", method=RequestMethod.POST)
    public String borrowBook(@ModelAttribute Book book, @ModelAttribute Person person) {
        String bookToBorrow = book.getBookName();
        String personToBorrow = person.getPersonName();
        String mobile = person.getMobile();
        Book dbBook = bookService.getBook(bookToBorrow);

        if(dbBook.getCopiesAvailable() >= 1) {
            List<Book> listOfBooks = Arrays.asList(dbBook);
            List<Person> listOfPersons = Arrays.asList(person);
            person.setListOfBooks(listOfBooks);
            book.setListOfPersons(listOfPersons);
            dbBook.setCopiesAvailable(dbBook.getCopiesAvailable() - 1);
            personService.borrowedBy(person);
            //bookService.decreaseCopiesAvailable(dbBook);
            bookService.updateBook(dbBook);
            return "borrowed_details";
        }
        else {
            return "book_not_available";
        }


    }

问题1 是当一个人归还一本书时,我无法在数据库中找到更新它的方法。如何删除与人和那本书相关的行?

问题2 创建此应用程序的方法(多对多,可连接)是否正确,或者以以下方式创建它是否更好,无需多对多关系, 1.创建表Book:bookName(primarykey),author,copiesTotal,copiesAvailable 2.创建表Person:personId(autogenerated pk),personName,bookName,mobile 3.当一个人借钱时,他以bookName被添加到Person表中;如果他借了另一本书,则在该书名中再添加一行 4.当人返回书时,使用personName和bookName查询删除该行 我觉得这种方法更容易。我错过了一些缺点吗? 谢谢你!

【问题讨论】:

  • 你的问题 2 方法更好,而不是删除该行添加一个像 book_returned 这样的字段,它可以是真或假
  • @AkhilMenon 谢谢!!!
  • 关于问题 #1,退回一本书很简单:只需从 Person.listOfBooks 中删除 Book。我在这里假设borrowBook 是事务性的(它确实应该是 - 事实上,我强烈建议您重构代码以将整个逻辑提取到事务性服务层方法中。即使您的应用程序似乎有服务层,一些业务逻辑仍然在控制器方法中执行,这闻起来关注点分离很差)
  • @crizzis 是的,我对一些代码感到困惑,即是否将其放入控制器或服务层。感谢您指出这一点!

标签: mysql jpa spring-boot many-to-many


【解决方案1】:

我发现方法 2 更糟糕,因为:

  1. 只有借书的人才能注册。
  2. 你将不得不复制那个人和他的所有 每次借书时的个人信息

方法一很好,但是 因为您可能想了解有关 JoinTable 的其他信息,例如 当用户借书或他是否归还时,您会发现更容易 为 joinTable 创建另一个实体,而不是使用 ManyToMany

这样您最终得到的 BookUser 实体与 OneToMany 关系到 UserBook 实体

你可以按照这个例子https://vladmihalcea.com/the-best-way-to-map-a-many-to-many-association-with-extra-columns-when-using-jpa-and-hibernate/

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2017-07-12
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2020-04-03
    相关资源
    最近更新 更多