mysql - Spring 启动: Deleting an entity in a many to many relationship

标签 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)是否正确,或者最好按以下方式创建它而不需要manytomany关系, 1.创建表Book:bookName(primarykey),author,copiesTotal,copiesAvailable 2.创建表Person:personId(自动生成的pk),personName,bookName,mobile 3.当一个人借阅时,他会被添加到Person表中,并带有bookName;如果他借了另一本书,则会在该书名上添加一行 4. 当一个人还书时,该行将被删除,并查询 personName 和 bookName 我感觉这个方法比较简单。我错过了一些缺点吗? 谢谢你!

最佳答案

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

  1. 您只能在某人借书时对其进行注册。
  2. 你将不得不复制那个人和他的所有 每次借书时的个人信息

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

这样您最终会得到 BookUser 实体,并且与 UserBook 实体具有 OneToMany 关系

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

关于mysql - Spring 启动: Deleting an entity in a many to many relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48439530/

相关文章:

java - 无法删除 Spring Hateoas 中的资源

php - MySQL while 循环只循环一次

php - mysql下发一个 'Can' t初始化字符集utf-8(路径:/usr/share/mysql/charsets/)' error,那里没有utf8.xml文件

javascript - 网站自动获取消息到 php 聊天应用程序不工作

java - JPA创建模式后如何使组件初始化?

java - 为什么 Eclipse Juno 4.2 运行 "JPA Java Change Event Handler"进程?

mysql - 如何反转或过滤掉在其他部门做项目的两名员工?

Java Spring Derby - 特定于单元测试的数据源

spring - Spring Boot 中的 Postgres 连接已关闭错误

java - Spring 安全CORS过滤器