休止状態が初めてなので、1対多および多対1の関係を使用する必要があります。オブジェクトの双方向の関係なので、どちらの方向からも横断できます。 mappedBy
が推奨される方法ですが、理解できませんでした。誰か説明できますか:
私の例のために、ここに注釈付きのクラスを示します。
Airline
OWNS manyAirlineFlights
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;
}
}
航空便:
@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);
}
}
編集:
データベーススキーマ:
AirlineFlightsはForeignKeyとしてidAirlineを持ち、AirlineはidAirlineFlightsを持ちません。これにより、AirlineFlightsが所有者/識別エンティティになりますか?
理論的には、航空会社がAirlinesFlightsのオーナーになりたいです。
両方のモデルで@JoinColumn
を指定すると、双方向の関係がなくなります。あなたには2つの一方向の関係があり、そのときの非常に混乱したマッピングがあります。両方のモデルに、IDAIRLINE列を「所有」していることを伝えています。本当にそれらの1つだけが実際にすべきです! 「通常の」ことは、@JoinColumn
側から@OneToMany
を完全に削除し、代わりにmappedByを@OneToMany
に追加することです。
@OneToMany(cascade = CascadeType.ALL, mappedBy="airline")
public Set<AirlineFlight> getAirlineFlights() {
return airlineFlights;
}
これは、Hibernateに「構成を見つけるためにコレクションを持っているものについて、「airline」という名前のBeanプロパティを調べてください。」
MappedByは、関係のキーが反対側にあることを休止状態に通知します。
つまり、2つのテーブルをリンクしても、それらのテーブルのうち1つだけが他のテーブルに対する外部キー制約を持ちます。 MappedByを使用すると、制約を含まないテーブルから他のテーブルにリンクすることができます。
mappedby
はそれ自体を語り、このフィールドをマップしないように休止状態を指示します。このフィールド[name = "field"]によって既にマップされています。
フィールドは他のエンティティ(name of the variable in the class not the table in the database)
。にあります。
そうしないと、休止状態は同じリレーションではないため、この2つのリレーションをマッピングします
そのため、一方の側でのみマッピングを行い、両者の間で調整するように休止状態に指示する必要があります。
mappedby = "別のクラスで作成された同じクラスのエンティティのオブジェクト"
注:1つのテーブルには外部キー制約が含まれている必要があるため、-Mapped byは1つのクラスでのみ使用できます。マップされたが両側に適用できる場合、両方のテーブルから外部キーを削除します。外部キーがなければ、2つのテーブル間のリレーションはありません。
注:-次の注釈に使用できます。-1. @ OneTone 2. @ OneToMany 3. @ ManyToMany
注---次の注釈には使用できません:-1. @ ManyToOne
1対1で:-マッピングの任意の側で実行しますが、片側のみで実行します。クラスが適用されるテーブルの外部キー制約の余分な列を削除します。
例えばEmployeeオブジェクトのEmployeeクラスでマップされたものを適用すると、Employeeテーブルの外部キーが削除されます。
ManyToOneマッピングから始めてから、OneToManyマッピングをBiDirectional方式にも配置しました。次に、OneToMany側(通常は親テーブル/クラス)で「mappedBy」(マッピングは子テーブル/クラスによって行われます)に言及する必要があるため、hibernateはDBにEXTRAマッピングテーブルを作成しません(TableName = parent_childなど)。