[解決済み] JPAの@JoinTableアノテーションはどのような場合に使用するのですか?
質問
どのような場合にJPA
@JoinTable
のアノテーションを使用してください。
解決方法は?
を編集 2017-04-29
: 一部のコメント欄で指摘されているように
JoinTable
は必要ありません。
mappedBy
アノテーション属性があります。実際、最近のバージョンのHibernateは、以下のようなエラーを出力して起動を拒否しています。
org.hibernate.AnnotationException:
Associations marked as mappedBy must not define database mappings
like @JoinTable or @JoinColumn
という名前のエンティティがあるとします。
Project
という名前のエンティティがあり、さらに
Task
で、各プロジェクトは多くのタスクを持つことができます。
このシナリオでは、2つの方法でデータベース・スキーマを設計できます。
最初の解決策は、テーブル名
Project
という名前のテーブルと
Task
という名前の外部キーカラムをタスクテーブルに追加します。
project_id
:
Project Task
------- ----
id id
name name
project_id
こうすることで、タスクテーブルの各行に対して、プロジェクトを決定することができるようになります。この方法を使えば、エンティティクラスでは、ジョインテーブルが不要になります。
@Entity
public class Project {
@OneToMany(mappedBy = "project")
private Collection<Task> tasks;
}
@Entity
public class Task {
@ManyToOne
private Project project;
}
もう一つの解決策は、第3のテーブルを使用することです。
Project_Tasks
プロジェクトとタスクの関係は、そのテーブルに格納されます。
Project Task Project_Tasks
------- ---- -------------
id id project_id
name name task_id
は
Project_Tasks
テーブルは、quot;Join Table"と呼ばれます。この2つ目のソリューションをJPAで実装するためには
@JoinTable
アノテーションを使用します。例えば、単方向の一対多の関連を実装するためには、以下のようなエンティティを定義します。
Project
の実体を表しています。
@Entity
public class Project {
@Id
@GeneratedValue
private Long pid;
private String name;
@JoinTable
@OneToMany
private List<Task> tasks;
public Long getPid() {
return pid;
}
public void setPid(Long pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Task> getTasks() {
return tasks;
}
public void setTasks(List<Task> tasks) {
this.tasks = tasks;
}
}
Task
のエンティティになります。
@Entity
public class Task {
@Id
@GeneratedValue
private Long tid;
private String name;
public Long getTid() {
return tid;
}
public void setTid(Long tid) {
this.tid = tid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
これにより、以下のようなデータベース構造が作成されます。
は
@JoinTable
アノテーションを使用すると、ジョインテーブルのさまざまな側面をカスタマイズすることもできます。例えば、アノテーション
tasks
プロパティはこのようなものです。
@JoinTable(
name = "MY_JT",
joinColumns = @JoinColumn(
name = "PROJ_ID",
referencedColumnName = "PID"
),
inverseJoinColumns = @JoinColumn(
name = "TASK_ID",
referencedColumnName = "TID"
)
)
@OneToMany
private List<Task> tasks;
その結果、データベースはこうなっただろう。
最後に、多対多の関連付けのためのスキーマを作成したい場合、結合テーブルを使用することが唯一の解決策となります。
関連
-
[解決済み] javax.mail.MessagingException: SMTPホストに接続できませんでしたか?
-
[解決済み] アニメーションGIFの表示
-
[解決済み] 文字列が一意な文字であるかどうかを判定する
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] JPA EntityManager。なぜmerge()ではなくpersist()を使うのか?
-
[解決済み] Javaの@Overrideアノテーションはいつ使うのか、なぜ使うのか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] tempとは何ですか、またjavaにおけるtempの用途は何ですか?
-
[解決済み] ボタンでTextFieldをクリアする(Java)
-
[解決済み] この配列の中の数字を入れ替えるには、何が足りないのでしょうか?ジャバ
-
[解決済み] Application startメソッドで例外が発生する。JavaFx 11
-
[解決済み] パラメータ[変数]の不正な修飾子;finalのみが許可される[closed]。
-
[解決済み] Java Genericメソッドをstaticにするには?
-
[解決済み] Oracle DB : java.sql.SQLException: 閉じた接続
-
[解決済み] Androidのコールバックとは何ですか?重複
-
[解決済み] Eclipse- Dynamic Web Module 3.0 で新しいプロジェクトを作成するときに Java 1.6 以降が必要なエラーが発生する。
-
[解決済み] タイプの安全性。アンチェック・キャスト