1. ホーム

[解決済み】JPA JoinColumnとmappedByの比較

2022-03-23 05:28:05

質問

とはどのような違いがあるのでしょうか。

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
    @JoinColumn(name = "companyIdRef", referencedColumnName = "companyId")
    private List<Branch> branches;
    ...
}

そして

@Entity
public class Company {

    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY, 
    mappedBy = "companyIdRef")
    private List<Branch> branches;
    ...
}

解決方法は?

@JoinColumn は、リレーションシップの両側で使用することができました。 を使用することについての質問でした。 @JoinColumn の上に @OneToMany 側(レアケース)。そして、ここでのポイントは 物理的情報複製 (列名)と共に 最適化されていないSQLクエリで、さらにいくつかの UPDATE ステートメント .

によると ドキュメンテーション :

から 多対一は (は、(ほとんど)常に 所有者側 JPA仕様では、1対多のリレーションは @OneToMany(mappedBy=...)

@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk")
    public Troop getTroop() {
    ...
} 

Troop とは、双方向の一対多の関係です。 Soldier を、troop プロパティを通して使用します。に物理的なマッピングを定義する必要はありません(してはいけません)。 mappedBy 側で使用します。

双方向の一対多のマッピングを行うには 一対多の側を所有する側とする を削除する必要があります。 mappedBy 要素に設定し、多数を1つの @JoinColumn として insertableupdatable を false に設定します。この解決策は最適化されておらず、さらにいくつかの UPDATE ステートメントを使用します。

@Entity
public class Troop {
    @OneToMany
    @JoinColumn(name="troop_fk") //we need to duplicate the physical information
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk", insertable=false, updatable=false)
    public Troop getTroop() {
    ...
}