【发布时间】:2016-07-15 07:07:24
【问题描述】:
我的问题很简单..
- 假设有 2 个类 .. 书籍和作者
- 假设一本书只能由一位作者撰写。
- 一个作者可以写很多本书。
- 假设作者有唯一的名字。 [没有 2 位作者可以同名]
现在 .. 假设所有 hibernate\JPA 配置都已完成。
从主要方法 - 我保存名为“book1”和作者姓名“author1”的 Book book1
如果我将级联设置为 ALL .. 书籍和作者都会在保存书籍时保存。
问题
现在,如果我保存同一作者的另一本书 - 它会再次保存书籍和作者。这意味着我最终得到了 2 个相同的作者。
我做了什么
- 我已将级联 ALL 替换为 MERGE。
- 在为书指定作者之前 - 我正在检查数据库中的名称 -
一个。如果我收到回复 - 我将检索到的作者分配给该书并保存该书。
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)分配给新客户。
我的问题是我在上面做了什么,即搜索现有作者(或上述情况下的地址)是正确的方法吗? .. 避免在作者(或地址表)中重复行
【问题讨论】:
-
欢迎来到 Stack Overflow,请阅读How do I ask a good question?,特别是“写一个总结具体问题的标题”部分。
-
添加将对象写入数据库的代码。我也怀疑这是你的实际对象,我缺少 getter/setter 和 equals/hashCode 实现。
-
添加到主帖
-
使用 saveOrUpdate 代替 save 没有帮助?
-
请阅读“更新”部分.. saveOrUpdate 无济于事
标签: java hibernate jpa spring-data