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(); }