2017-08-13 13 views
0

EclipseLink(2.5.2)でJPAを使用しています。JPA - なぜ@JoinColumnを使用するのですか?

I持って、次のエンティティ:

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

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String name; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "PRODUCER_ID") 
    private Producer producer; 

    public Consumer() { 
    } 


    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Producer getProducer() { 
     return producer; 
    } 

    public void setProducer(Producer consumesFrom) { 
     this.producer = consumesFrom; 
    } 




} 

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

    private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer Id; 
    private String dataType; 

    private List<Consumer> consumers = new ArrayList<>(); 


    public Producer() { 
    } 

    public Integer getId() { 
     return Id; 
    } 

    public void setId(Integer id) { 
     this.Id = id; 
    } 

    public String getDataType() { 
     return dataType; 
    } 

    public void setDataType(String dataType) { 
     this.dataType = dataType; 
    } 


} 

と消費者の持続性:

consumer.setProducer(producer); 
    entityManager.persist(consumer); 

私が削除した場合に予想される結果にほとんど違いはありません@JoinColumn(name = "PRODUCER_ID")。 私はそれが本当に何であるかを理解しようとしています。私はインターネット上で様々な例を読んだ

、私はそれが目的だということを理解して2つのテーブルを結合するために使用されているが、これはすでに@ManyToOneを通じて達成される列を定義することです。

だから、その中のポイントは何ですか?

+1

カラム名を指定しないと、「結合テーブルではなくFKを使用する」と言うと便利です。列名では、JPAのデフォルトの列名 –

+1

PSではなく、このFK列名を指定します。「@ Consumer」に '@ OneToMany'を追加するのを忘れてしまったようです。 JPAプロバイダが注釈を見る必要があるのは間違いありませんが(それはイントロスペクションによってその情報を得ることができるためです)、それを提供するJPA仕様の一部であるため、 'mappedBy'を指定してBIDIRECTIONAL –

答えて

2

JPA仕様で指定されているデフォルトの方法でManyToOneをマップすると、(たとえば、テーブルを結合するのではなく)結合列を使用し、あなたのために選択した名前を使用するためです列を結合し、ターゲットエンティティのIDを参照します。別の列名が必要な場合、または別の列を参照する場合は、注釈が必要になります。

JoinColumnには他にも多くの属性があります(ちょうどthe documentationと読んでください)。そのため、使用したい場合は注釈を指定する必要があります。

関連する問題