2016-07-15 218 views
0

我的問題很簡單..Hibernate | Spring Data JPA | @OneToOne

  1. 比方說,有2類..在圖書和作者
  2. 讓我們假設一本書只能由1個作者寫的。
  3. 作者可以寫很多書。
  4. 讓我們假設作者有獨特的名字。 [沒有2位作者可以有同名]

現在..假設所有的hibernate \ JPA配置都完成了。

從主要的方法 - 我救一個具有名稱「BOOK1」和作者姓名「作者1」

書BOOK1如果我把級聯所有..兩本書和作者能夠順利通過省書保存。

問題

現在,如果我救另一個書同一作者 - 它節省了書,再創作。這意味着我結束了2個相同的作者。

我做了什麼

  1. 我更換級聯ALL用MERGE。
  2. 分配筆者前書 - 我檢查DB的名字 -

一個。如果我得到迴應 - 我將檢索到的作者分配給書並保存該書。

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)分配給新客戶。

我的問題是我上面做了什麼,即搜索現有作者(或上述案例中的地址)是否正確? ..避免在作者(或地址表)重複的行

+1

歡迎閱讀堆棧溢出,請閱讀[**我如何問一個好問題?**](http://stackoverflow.com/help/how-to-ask)特別是**「Write一個總結特定問題的標題「**部分。 –

+0

添加將對象寫入數據庫的代碼。我也懷疑這是你錯過getter/setter和equals/hashCode實現的實際對象。 –

+0

添加到主帖 – reverse

回答

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>(); 

} 
+0

嗯..它不是那麼簡單..例如..客戶和地址..客戶可以有一個或多個地址..如果新客戶是與其他客戶共享地址..然後不要堅持地址..只需將地址(id)分配給新客戶。 – reverse

+0

@reverse我更新 –

+0

謝謝,但我的問題是不同的。 ..映射不會自動保存重複..對嗎?我們必須自己照顧..通過在數據庫中首先查找..就像我在主要方法中所做的一樣..複製粘貼上面..請注意,我的問題不是映射..它是關於避免在「映射」實體中出現重複。 – reverse

相關問題