我正在准备简单的 Spring 应用程序。我有 2 个实体:Book.class(父)和 Author.class(子):来自 Author 视图的 @OneToMany 和来自 Book 视图关系的 @ManyToOne(cascade=CascadeType.PERSIST)。在保存新书的同时——作者也被保存并添加到数据库(mySql)中——这就是我想要的。但我不明白为什么 Spring 添加作者 - 如果这样的项目已经存在。如何更改代码以确保只有唯一的作者将添加到数据库中,并且数据库中的作者表中不会有重复?
我已经向 Author 类添加了 hashCode 和 equals 方法,但它没有帮助。我也尝试更改 Cascade.Type 但也没有帮助。
Author.class(部分代码):
@Entity
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstName;
private String lastName;
@OneToMany(mappedBy = "author")
@JsonManagedReference(value = "book-author")
private Set<Book> books = new HashSet<Book>();
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Author author = (Author) o;
return Objects.equals(getFirstName(), author.getFirstName()) &&
Objects.equals(getLastName(), author.getLastName());
}
@Override
public int hashCode() {
return Objects.hash(getFirstName(), getLastName());
}
和 Book.class(部分代码):
@Entity
public class Book {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToOne( cascade=CascadeType.PERSIST)
@JoinColumn(name = "author_id", unique = true)
@JsonBackReference(value="book-author")
private Author author;
编辑 1 BookServiceImpl.class
@Override
public BookDto addBookDto(BookDto bookDto) {
Book book = bookConverter.apply(bookDto);
bookRepository.save(book);
return bookDtoConverter.apply(book);
}
AuthorServiceImpl.class
@Override
public Author findAuthor(String firstName, String lastName) {
Optional<Author> authorByNameOptional = authorRepository.findByFirstNameAndLastName(firstName, lastName);
if (authorByNameOptional.isPresent()) {
return authorByNameOptional.get();
} else {
Author newAuthor = new Author();
newAuthor.setFirstName(firstName);
newAuthor.setLastName(lastName);
return newAuthor;
}
和 BookWebController.class
@PostMapping("/addWebBook")
public String addBook(@ModelAttribute(name = "addedBook") BookDto addedBook, Model model) {
Author author1 = addedBook.getAuthor();
Author author = authorService.findAuthor(author1.getFirstName(), author1.getLastName());
addedBook.setAuthor(author);
bookService.addBookDto(addedBook);
return "redirect:/message?msg";
}
任何提示都会非常有用,因为我对这个领域很陌生:-)