为了账号安全,请及时绑定邮箱和手机立即绑定

使用数据库 jpa 中现有和不存在的数据保存新数据时出错

使用数据库 jpa 中现有和不存在的数据保存新数据时出错

函数式编程 2023-03-02 16:04:13
我有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 找到的,另一个是您创建并在您的书中引用的)。我没有测试这个解决方案,如果它不起作用,请在评论中告诉我。


查看完整回答
反对 回复 2023-03-02
  • 1 回答
  • 0 关注
  • 90 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信