gpt4 book ai didi

java - hibernate | Spring数据JPA | @一对一

转载 作者:行者123 更新时间:2023-12-01 21:24:41 26 4
gpt4 key购买 nike

我的问题很简单..

  1. 假设有 2 个类..书籍和作者
  2. 假设一本书只能由一位作者撰写。
  3. 一个作家可以写很多本书。
  4. 假设作者有唯一的名字。 [两个作者不能同名]

现在..假设所有 hibernate\JPA 配置均已完成。

从主方法 - 我保存名为“book1”和作者姓名“author1”的图书 book1

如果我将级联设置为 ALL .. 书籍和作者都会在保存书籍时保存。

问题

现在,如果我保存同一作者的另一本书 - 它会再次保存书籍和作者。这意味着我最终会遇到 2 位相同的作者。

我做了什么

  1. 我已将级联 ALL 替换为 MERGE。
  2. 在将作者分配给书籍之前 - 我正在数据库中检查名称 -

a.如果我得到回复 - 我将检索到的作者分配给该书并保存该书。

b.如果我没有得到任何结果 - 我将作者分配给该书并保存作者和书。

这样我就能解决我的问题。

但是这是正确的方法吗?

@Entity 
class Book{

@Id
private Long bookId;

private String name;

@OneToOne
private Author author;

}

@Entity
class Author{

@Id
private Long authorId;
private String name;

}
<小时/>

主要代码

public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(BeanConfiguration.class, args);
BookRepository bookRepo = context.getBean(BookRepository.class);
AuthorRepository authorRepo = context.getBean(AuthorRepository.class);

Book b1 = new Book();
b1.setBookName("book1");

Author a1 = new Author();
a1.setAuthorName("author1");

Author authorFromDatabase = authorRepo.findByAuthorName(a1.getAuthorName());
if (authorFromDatabase == null) {
b1.setAuthor(a1);
authorRepo.save(a1);
} else {
b1.setAuthor(authorFromDatabase);
}
bookRepo.save(b1);
}

更新事情没那么简单.. 例如.. 请考虑.. 客户和地址之间的关联.. 客户可以有一个或多个地址.. 如果新客户与其他客户共享地址.. 那么就不要使地址持久化..只需将地址(id)分配给新客户即可。

我的问题是我上面做了什么,即搜索现有作者(或上述情况中的地址)是正确的方法吗? ..避免作者(或地址表)中出现重复行

最佳答案

如果Author可以有多个Book,则不是@OneToOne关联,而是@OneToMany关联。

@Entity 
class Book{

@Id
@GeneratedValue
private Long id;

private String name;

@ManyToOne(fetch = FetchType.LAZY)
private Author author;

}

@Entity
class Author{

@Id
@GeneratedValue
private Long id;

private String name;

@OneToMany(mappedBy = "author")
private List<Book> books = new ArrayList<Book>();

}

将书籍添加到作者的最简单方法

Author author = new Author();
save(author);

Book book = new Book();
book.setAuthor(author);
save(book);

Book goodBook = new Book();
goodBook.setAuthor(author);
save(goodBook);

Book 不是引用值(我的意思是目录、引用表),因此我们可以通过 Book 部分上的外键使用关联。

如果您需要使用诸如 CustomerAddress(引用)之类的引用值,则应使用联接表。

@Entity 
class Address {

@Id
@GeneratedValue
private Long id;

}

@Entity
class Customer{

@Id
@GeneratedValue
private Long id;

private String name;

@OneToMany
private List<Address> addresses = new ArrayList<Address>();

}

关于java - hibernate | Spring数据JPA | @一对一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38389882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com