2.2.5.2. Many-to-one 多対一

<2.2.5.2. Many-to-one | 目次 | 2.2.5.3. Collections>

多対一関連は @ManyToOneアノテーションをプロパティレベルに宣言するよ。

@Entity()
public class Flight implements Serializable {
    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
    @JoinColumn(name="COMP_ID")
    public Company getCompany() {
        return company;
    }
    ...
}

@JoinColumn 属性はオプションで、デフォルトは一対一のように、関連名と、_(アンダースコア)、主キー名を結合したものになるよ。この例では、プロパティ名が company で、Company の主キーが id だから、company_id だよ。

@ManyToOne は対象のエンティティ名を指定する targetEntity パラメータを持つよ。大概はデフォルト値でいけると思うから、特にこのパラメータは必要ないんだけど、プロパティの型に、生のエンティティじゃなくてインターフェースを使いたい時に役立つよ。

@Entity()
public class Flight implements Serializable {
    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity=CompanyImpl.class )
    @JoinColumn(name="COMP_ID")
    public Company getCompany() {
        return company;
    }
    ...
}

public interface Company {
    ...

他に、関連テーブルを使う方法もあるよ。@JoinTable アノテーションで宣言された関連テーブルは、エンティティテーブルを参照する外部キー(@JoinTable.joinColumnsを使って)と、対象のエンティティテーブルを参照する外部キー(@JoinTable.inverseJoinColumns)を含むよ。

@Entity()
public class Flight implements Serializable {
    @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
    @JoinTable(name="Flight_Company",
        joinColumns = @JoinColumn(name="FLIGHT_ID"),
        inverseJoinColumns = @JoinColumn(name="COMP_ID")
    )
    public Company getCompany() {
        return company;
    }
    ...
}

<2.2.5.2. Many-to-one | 目次 | 2.2.5.3. Collections>