Spring boot:删除多对多关系中的实体

时间:2018-01-25 09:28:40

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

我正在使用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 创建此应用程序的方法(manytomany,jointable)是否正确,或者以下面的方式创建它是否更好,没有多少关系, 1.创建表Book:bookName(primarykey),author,copiesTotal,copiesAvailable 2.创建表人:personId(自动生成的pk),personName,bookName,mobile 3.当一个人借用时,他被添加到带有bookName的Person表中;如果他借了另一本书,那么又添加了一本书名 4.当某人返回书籍时,将使用personName和bookName查询删除该行 我觉得这种方法更容易。我错过了一些缺点吗? 谢谢你!

1 个答案:

答案 0 :(得分:0)

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

  1. 你只能在借书时注册一个人。
  2. 你将不得不复制那个人和他所有的人     每次他借书时的个人信息
  3. 接近一个很好,但是  因为您可能想要了解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/

    进行操作