2017-08-28 10 views
0

同じ名前の外部キーを接続しますJPAはのは、私が持っていると仮定してみましょう

  1. エディタ(ID、BUSINESS_NAME、バット)
  2. 著者(ID、名前、電子メール)
  3. (id、title、description、fk_author、fk_editor)。

はのは、fk_editorは、IDテーブルエディタのフィールドとfk_authorの外部キーであるテーブルの作者のidフィールドの外部キーであるとしましょう。著者がnは次のとおりです:1つのブック:編集者nは:1

はのは、関係本を言ってみましょう。

質問はどのように3つのテーブルを結合する書籍テーブルを介して? つまり、Hibernateが著者や編集者との関係を作るためにHibernateに理解させるためにBookクラスにどのようなコードを追加する必要がありますか?著者と編集者に同じIDフィールド名があることを考慮してください。 ここではそれは私が修正する必要があるサンプルコードです:

テーブル著者

package com.bytecode.jpaexample.SpringBootMySqlJpaRestExample; 

import javax.persistence.*; 
import java.io.Serializable; 

@Entity 
@Table(name = "authors") 
public class Author implements Serializable{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    @OneToMany(fetch = FetchType.LAZY) 
    private int id; 

    @Column(name = "name") 
    private String name; 

    @Column(name = "surname") 
    private String surname; 

    @Column(name = "email") 
    private String email; 

    /* constructors and getters and setters omitted intentionally */ 

} 

テーブルエディタ

package com.bytecode.jpaexample.SpringBootMySqlJpaRestExample; 

import javax.persistence.*; 
import java.io.Serializable; 

@Entity 
@Table(name = "editors") 
public class Editor implements Serializable{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    @OneToMany(fetch = FetchType.LAZY) 
    private int id; 

    @Column(name = "business_name") 
    private String businessName; 

    @Column(name = "vat") 
    private String vat; 

    /* constructors and getters and setters omitted intentionally */ 

} 

テーブル

package com.bytecode.jpaexample.SpringBootMySqlJpaRestExample; 

import javax.persistence.*; 
import java.io.Serializable; 

@Entity 
@Table(name="books") 
public class Book implements Serializable{ 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private int id; 

    @Column(name = "title") 
    private String title; 

    @Column(name = "description") 
    private String description; 

    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "id") //authors.id     
    @Column(name = "fk_author") 
    private int fk_editor; 

    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "id") //editors.id     
    @Column(name = "fk_editor") 
    private int fk_editor; 

    /* constructors and getters and setters omitted intentionally */ 
} 

答えて

1

いくつかのこと:

AuthorEditorクラスは@OneToManyでアノテート自分idフィールドを持つべきではありません。

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "id") 
    private int id; 

代わりに、私はあなたが各クラスに別のフィールドをしたい推測している:

@Entity 
@Table(name = "authors") 
public class Author implements Serializable { 
    ... 
    @OneToMany(mappedBy = "author", fetch = FetchType.LAZY) 
    private List<Book> books; 
    ... 
} 

@Entity 
@Table(name = "editors") 
public class Editor implements Serializable { 
    ... 
    @OneToMany(mappedBy = "editor", fetch = FetchType.LAZY) 
    private List <Book> books; 
    ... 
} 

次に、クラスBookをいくつかの方法で変更する必要があります。

  • フィールドの名前をもう少し適切に変更してください(例: fk_authorauthorとなる。これらは対応クラスのmappedBy設定と一致する必要があります)。
  • フィールドタイプを適切なクラス(Author)、)に変更します。int
  • 変化@JoinColumn注釈はbooksテーブル(ないターゲットテーブル)内の適切な列を指定し、これらは、この場合にはオプションで、ものの(referencedColumnName設定を追加するために、それらは単一の一次キー・フィールドにデフォルト設定されますので
  • )ターゲット・エンティティに、これは理にかなっている場合 @Column注釈

を参照してください削除:

@Entity 
@Table(name="books") 
public class Book implements Serializable { 
    ... 
    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "fk_author", referencedColumnName="id") 
    private Author author; 

    @ManyToOne(fetch = FetchType.LAZY)  
    @JoinColumn(name = "fk_editor", referencedColumnName="id") 
    private Editor editor; 
    ... 
} 
関連する問題