休眠| Spring Data JPA | @OneToOne

时间:2016-07-15 07:07:24

标签: java hibernate jpa spring-data

我的问题非常简单..

  1. 我们说有两个班级......书和作者
  2. 我们假设一本书只能由1位作者撰写。
  3. 作者可以写很多书。
  4. 让我们假设作者有唯一的名字。 [没有2位作者可以使用相同名称]
  5. 现在......假设所有的hibernate \ JPA配置都已完成。

    从主要方法 - 我保存书名1,名称" book1"和作者姓名" author1"

    如果我把cascade作为ALL ...那么书籍和作者都会在保存书籍时保存。

    问题

    现在,如果我用同一作者保存另一本书 - 它会再次保存书籍和作者。这意味着我最终会有两位同样的作者。

    我做了什么

    1. 我用MERGE替换级联ALL。
    2. 在将作者分配到预订之前 - 我正在检查DB的名称 -
    3. 一个。如果我收到回复 - 我将检索到的作者分配到书中并保存书籍。

      湾如果我没有得到任何结果 - 我将作者分配到书中并保存两位作者和书籍。

      这样我就可以解决我的问题了。

      但这是正确的方法吗?

      @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)分配给新客户。

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

1 个答案:

答案 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部分的外键使用关联。

如果您需要使用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>();

}