[解決済み】JPAとHibernateのmappedByを説明できる人はいますか?
2022-04-12 19:19:53
質問
私はhibernateの初心者で、一対多と多対一のリレーションを使用する必要があります。私のオブジェクトでは双方向のリレーションで、どちらの方向からもトラバースできるようになっています。
mappedBy
が推奨されている方法ですが、私には理解できませんでした。どなたか説明してください。
- どのような使い方が推奨されていますか?
- どのような目的で使用するのですか?
例として、アノテーションを付けた私のクラスを紹介します。
-
Airline
OWNS多数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;
}
}
エアラインフライトズ
@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を持ち、AirlineはidAirlineFlightsを持たない。これは、所有者/識別エンティティとして、AirlineFlightsになりますか?
理論的には、航空会社がairlineFlightsのオーナーになるようにしたいです。
解決方法は?
を指定することで
@JoinColumn
を両方のモデルで使用すると、双方向の関係にはなりません。 一方通行の関係が2つあり、しかもそのマッピングは非常にわかりにくいものです。 あなたは両方のモデルに IDAIRLINE カラムを所有していると言っているのです。 実際には、どちらか一方だけが所有する必要があります。 通常」は
@JoinColumn
から
@OneToMany
側を完全に削除し、代わりにmappedByを
@OneToMany
.
@OneToMany(cascade = CascadeType.ALL, mappedBy="airline")
public Set<AirlineFlight> getAirlineFlights() {
return airlineFlights;
}
これはHibernateに"私がコレクションしている'airline'という名前のビーンプロパティを調べて、構成を見つけるようにと伝えています。
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
[解決済み] maven. -source 1.5ではラムダ式がサポートされていません。
-
[解決済み] enumのordinalを使用するのは良い習慣ですか?
-
[解決済み] Cloneable throws CloneNotSupportedException
-
[解決済み] android.support.v4.app.FragmentActivity' で 'TAG' がプライベートアクセスされている。
-
[解決済み] javascriptでExpression言語を使うには?
-
[解決済み] ファイルを作成せずに、ファイルが存在するかどうかをチェックする
-
[解決済み] HTTP ステータス 500 - サーブレットクラス pkg.coreServlet のインスタンス化に失敗しました。
-
[解決済み] Javaにおけるシンボリック参照
-
[解決済み】JPA JoinColumnとmappedByの比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ボタンでTextFieldをクリアする(Java)
-
[解決済み] JavaでFileFilterを作るには?
-
[解決済み] 環境変数JAVA_OPTSの使い方を教えてください。
-
[解決済み] java.util.concurrent.ExecutionException 例外をどのように処理しますか?
-
[解決済み] Androidのコールバックとは何ですか?重複
-
[解決済み] Javaでのスキャナが動作しない
-
[解決済み] eclipseからTomcatに物理的に発行されるmyjspはどこにあるのでしょうか?
-
[解決済み] Mavenです。JARは空になります - 含有するためにマークされたコンテンツがありません
-
[解決済み] publicId と systemId の間に空白が必要です。
-
[解決済み】JPA JoinColumnとmappedByの比較