我的问题非常简单..
现在......假设所有的hibernate \ JPA配置都已完成。
从主要方法 - 我保存书名1,名称" book1"和作者姓名" author1"
如果我把cascade作为ALL ...那么书籍和作者都会在保存书籍时保存。
问题
现在,如果我用同一作者保存另一本书 - 它会再次保存书籍和作者。这意味着我最终会有两位同样的作者。
我做了什么
一个。如果我收到回复 - 我将检索到的作者分配到书中并保存书籍。
湾如果我没有得到任何结果 - 我将作者分配到书中并保存两位作者和书籍。
这样我就可以解决我的问题了。
但这是正确的方法吗?
@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);
}
更新 它不是那么简单..例如..请考虑...客户和地址之间的关联..客户可以有一个或多个地址..如果新客户与其他客户共享地址..那么请&#39 ; t使持久性地址..只需将地址(id)分配给新客户。
我的问题是我上面做了什么,即搜索现有作者(或上述案例中的地址)是正确的方法? ..以避免作者(或地址表)中的重复行
答案 0 :(得分:3)
如果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 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
部分的外键使用关联。
如果您需要使用Customer
和Address
(参考)等参考值,则应使用连接表。
@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>();
}