我正在使用 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 更糟糕,因为:
- 您只能在某人借书时对其进行注册。
- 你将不得不复制那个人和他的所有 每次借书时的个人信息
方法一很好,但是
因为您可能想获得有关 JoinTable
的其他信息,例如
当用户借书或归还时,您会发现更容易
为 joinTable 创建另一个实体,而不是使用 ManyToMany
这样您最终会得到 Book
和 User
实体,并且与 UserBook
实体具有 OneToMany
关系
关于mysql - Spring 启动: Deleting an entity in a many to many relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48439530/