我有Book桌子和Author桌子。他们的关系是many-to-many。我的目标我希望能够坚持新书。如果书籍的作者已经存在于Author表中,我不想在Author表中保留相同的作者。如果作者在表中不存在Author,则作者数据将保留在Author表中。以下是我声明实体和 serviceImplementation 以保存数据的方式:书@Entity(name = "book")public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "title", nullable = false) private String title; @Column(name = "year", nullable = false) private String year; @ManyToMany(cascade = CascadeType.ALL) @JoinTable( name = "book_author", joinColumns = @JoinColumn(name = "book_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "author_id", referencedColumnName = "id")) @JsonManagedReference private Set<Author> author; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "category_id", referencedColumnName = "id", nullable = false) @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) private BookCategory category;}作者@Entity(name = "author")public class Author { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name", nullable = false) private String name; @Column(name = "address", nullable = false) private String address; @ManyToMany(mappedBy = "author", cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JsonBackReference private Set<Book> book;}如果所有作者都存在于Author表中或表中根本不存在,则上面的代码是有效的Author。如果其中一个存在而另一个不存在,它将根据CascadeType我在定义实体时使用的错误抛出错误。
1 回答
慕尼黑的夜晚无繁华
TA贡献1864条经验 获得超6个赞
我会这样尝试:
for (AuthorDto authorDto : dataAuthorDto) {
Author author = authorDao.findByName(authorDto.getName());
if (null == author) {
author = new Author();
BeanUtils.copyProperties(authorDto, author);
}
dataAuthor.add(author);
}
这样,如果您在数据库中找到一位作者,您可以在您的书中引用现有作者,而不是创建一个新作者。这样您就不会在持久性上下文中得到两个相同的作者(一个是您使用 findByName 找到的,另一个是您创建并在您的书中引用的)。我没有测试这个解决方案,如果它不起作用,请在评论中告诉我。
添加回答
举报
0/150
提交
取消