私は休止状態にするのが初めてで、1対多と多対1の関係を使用する必要があります。それは私のオブジェクト内の双方向の関係であり、どちらの方向からでも移動することができます。それについては、mappedBy
がおすすめですが、わかりませんでした。誰かが私に説明してください:誰かがmappedByを休止状態で説明できますか?
- どのような方法をお勧めしますか?
- これはどのような目的で解決されますか?ここに私の例のため
は、注釈と私のクラスです:
Airline
は、多くのAirlineFlights
- 多く
AirlineFlights
がONEAirline
航空:
@Entity
@Table(name="Airline")
public class Airline {
private Integer idAirline;
private String name;
private String code;
private String aliasName;
private Set<AirlineFlight> airlineFlights = new HashSet<AirlineFlight>(0);
public Airline(){}
public Airline(String name, String code, String aliasName, Set<AirlineFlight> flights) {
setName(name);
setCode(code);
setAliasName(aliasName);
setAirlineFlights(flights);
}
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="IDAIRLINE", nullable=false)
public Integer getIdAirline() {
return idAirline;
}
private void setIdAirline(Integer idAirline) {
this.idAirline = idAirline;
}
@Column(name="NAME", nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = DAOUtil.convertToDBString(name);
}
@Column(name="CODE", nullable=false, length=3)
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = DAOUtil.convertToDBString(code);
}
@Column(name="ALIAS", nullable=true)
public String getAliasName() {
return aliasName;
}
public void setAliasName(String aliasName) {
if(aliasName != null)
this.aliasName = DAOUtil.convertToDBString(aliasName);
}
@OneToMany(fetch=FetchType.LAZY, cascade = {CascadeType.ALL})
@JoinColumn(name="IDAIRLINE")
public Set<AirlineFlight> getAirlineFlights() {
return airlineFlights;
}
public void setAirlineFlights(Set<AirlineFlight> flights) {
this.airlineFlights = flights;
}
}
AirlineFlights:
@Entity
@Table(name="AirlineFlight")
public class AirlineFlight {
private Integer idAirlineFlight;
private Airline airline;
private String flightNumber;
public AirlineFlight(){}
public AirlineFlight(Airline airline, String flightNumber) {
setAirline(airline);
setFlightNumber(flightNumber);
}
@Id
@GeneratedValue(generator="identity")
@GenericGenerator(name="identity", strategy="identity")
@Column(name="IDAIRLINEFLIGHT", nullable=false)
public Integer getIdAirlineFlight() {
return idAirlineFlight;
}
private void setIdAirlineFlight(Integer idAirlineFlight) {
this.idAirlineFlight = idAirlineFlight;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="IDAIRLINE", nullable=false)
public Airline getAirline() {
return airline;
}
public void setAirline(Airline airline) {
this.airline = airline;
}
@Column(name="FLIGHTNUMBER", nullable=false)
public String getFlightNumber() {
return flightNumber;
}
public void setFlightNumber(String flightNumber) {
this.flightNumber = DAOUtil.convertToDBString(flightNumber);
}
}
EDIT:
データベース・スキーマ:
AirlineFlightsのForeignKeyとしてidAirlineを持っている会社は何のidAirlineFlightsを持っていません。これは、AirlineFlightsを所有者/身元確認主体としていますか?
理論的には、私は航空会社が航空会社のフライトの所有者であることを希望します。
私は、mappedByについて最後にあなたの説明で少し混乱しています。物事がデータベースでどのように整理されるかは重要ですか? @DB:AirlineFlightsには、外部キーとしてidAirlineがあります。航空会社はidAirlineをプライマリキーとして持っており、AirlineFlights @ DBに関する情報は得られません。 – brainydexter
はい、問題ありません。 mappedByの名前は、HibernateにJoinColumnの設定を見つける場所を伝えています。 (AirlineFlightのgetAirline()メソッドについて)JoinColumnを航空会社に配置した方法は、Airlineに他のテーブルに値を保持する責任があることを伝えています。 Entityに別のテーブルのカラムを「所有」していることを伝えることができ、それを更新する責任があります。あなたが通常やりたいことではなく、SQL文が実行される順序で問題を引き起こす可能性があります。 – Affe
編集をご覧ください。 DBレベルでは、airlineFlightテーブルはidAirlineを外部キー列として所有しています。したがって、JoinColumnは、対応するManytoOneのairlineFlightクラス/テーブルに置く必要があります。 – brainydexter