【发布时间】: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