Relation Mappingは、リレーショナルデータベースの複数のテーブルを組み合わせてデータにアクセスするときの手法です。
リレーショナルデータベースでは、正規化という手法によりテーブルが細かく分割されていきます。このようなテーブル同士を組み合わせて情報を取得するとき、Relation Mappingの考え方が利用されます。
Relation Mappingには、次の4パターンがあります。
図9.1[一対一の関係]は、一対一の関係を表したものです。
「社員テーブル」では、社員の情報を表しています。社員の住所は「住所テーブル」で管理されており、住所テーブルの主キーを社員テーブルでは項目として管理しています。
このとき、ひとりの「社員」はひとつの「住所」と対応することになります。これが「一対一」の関係です。
社員テーブルをEntity Beanで表してみましょう。
@OneToOneというAnnotationで修飾されているaddressプロパティに注目してください。
社員テーブルでは項目として管理している住所テーブルの主キーの部分を、Addressオブジェクトとして管理することになります。このAddressオブジェクトは、住所テーブルと対応関係にあるEntity Beanになります。
このようにして、EmployeeとAddressが@OneToOne Annotationによって一対一の関係を構築しているのです。
@Entity
@Table(name="EJB_EMPLOYEE")
public class Employee implements Serializable {
@Id @Column(name="EMP_ID")
:
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="ADDR_ID")
public Address getAddress() { return address; }
}
最後に、Session Facadeを使って、ある社員の住所を取得する例をご紹介しましょう。
public Address getAddressForEmployee(Integer employeeId) {
Employee employee =
em.find(Employee.class, employeeId);
return employee.getAddress();
}