1. ホーム

[解決済み】JPAとHibernateのmappedByを説明できる人はいますか?

2022-04-12 19:19:53

質問

私はhibernateの初心者で、一対多と多対一のリレーションを使用する必要があります。私のオブジェクトでは双方向のリレーションで、どちらの方向からもトラバースできるようになっています。 mappedBy が推奨されている方法ですが、私には理解できませんでした。どなたか説明してください。

  • どのような使い方が推奨されていますか?
  • どのような目的で使用するのですか?

例として、アノテーションを付けた私のクラスを紹介します。

  • Airline OWNS多数 AirlineFlights
  • 多くの AirlineFlights に所属しています。 ONE Airline

航空会社 :

@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'という名前のビーンプロパティを調べて、構成を見つけるようにと伝えています。