2016-07-15 11 views
0

私の質問は非常に単純な..ですHibernate | SpringデータJPA | @OneToOne

  1. 帳や著者
  2. はのは、本がONLY 1人の著者によって書かれたことができると仮定しよう。..さんは2クラスがあるとしましょう。
  3. 著者は多くの本を書くことができます。
  4. 著者に一意の名前が付いているとしましょう。 [2人の作者は同じ名前を持つことができません]

今、すべてのhibernate \ JPA設定が完了したと仮定します。 mainメソッドから

- 私はALLとしてカスケードを置けば、私は名前を「BOOK1」と著者名「author1」

を持つブックBOOK1を保存するには...書籍や著者の両方がブックを保存するときに保存されます。それは再び本と著者の両方を保存している - 私は同じ著者で別のブックを保存する場合は今、

問題

。これは私が同じ2人の著者で終わることを意味します。私は

  1. を行っている何

    私はすべての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)を割り当ててください。

私の質問は上記のことです。つまり、既存の著者(または上記のアドレス)を検索するのが正しいアプローチですか? Authorそれは@OneToOne協会が、@OneToMany関連ではない多くのBookを持つことができれば...著者(またはアドレステーブル)での重複行

+1

[**私はどのように良い質問をしますか?**](http://stackoverflow.com/help/how-to-ask)特定の問題をまとめたタイトル "**セクション。 –

+0

オブジェクトをデータベースに書き込むコードを追加します。私はこれがあなたの実際のオブジェクトであるとは思わない。私はgetter/setterとequals/hashCodeの実装が不足している。 –

+0

メインポストに追加 – reverse

答えて

3

を避けるために。

@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に本を追加する最も簡単な方法は、基準値(Iカタログ、参照テーブルを意味する)ではありませんので、我々は外国を経由して関連付けを使用することができます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

うーん..それは単純ではありません。例えば、顧客と住所..顧客は1つ以上の住所を持つことができます。他の顧客とアドレスを共有しています。アドレスで永続化しないでください。新しい顧客にアドレス(id)を割り当ててください。 – reverse

+0

@リバース私は更新 –

+0

ありがとう、しかし私の質問は異なっています。 ..マッピングは重複を自動的に保存しません。私たちは自分自身を世話しなければならないでしょう。データベースの最初の部分を調べることによって、私はメインメソッドで行ったように..上にコピーされて貼り付けられました。私の質問はマッピングに関するものではありません。 「マップされた」エンティティに重複を避ける。 – reverse

関連する問題