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
を通じて達成される列を定義することです。
だから、その中のポイントは何ですか?
カラム名を指定しないと、「結合テーブルではなくFKを使用する」と言うと便利です。列名では、JPAのデフォルトの列名 –
PSではなく、このFK列名を指定します。「@ Consumer」に '@ OneToMany'を追加するのを忘れてしまったようです。 JPAプロバイダが注釈を見る必要があるのは間違いありませんが(それはイントロスペクションによってその情報を得ることができるためです)、それを提供するJPA仕様の一部であるため、 'mappedBy'を指定してBIDIRECTIONAL –