我正在使用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查询删除该行 我觉得这种方法更容易。我错过了一些缺点吗? 谢谢你!
答案 0 :(得分:0)
我发现方法2更糟,因为:
JoinTable
之类的其他信息
当用户借书或者他是否回来时,你会发现更容易
为joinTable创建另一个实体,而不是使用ManyToMany
这样,您最终得到的Book
和User
实体与OneToMany
实体的关系UserBook