Upload
steve
View
45
Download
0
Embed Size (px)
DESCRIPTION
Relation Mapping. EJB 3.0 コース 第 9 回 2006 年 8 月 6 日. ここでの目標. 複数のテーブルを組み合わせてデータにアクセスする「 Relation Mapping 」について理解する. 一対一の関係 : @OneToOne. 一対一の関係 : 従業員と自宅の住所. EJB_EMPLOYEE 社員テーブル. EJB_EMPLOYEE 社員テーブル. EJB_ADDRESS 住所テーブル. 住所の ID から住所を得る. @ Entity @Table(name="EJB_EMPLOYEE") - PowerPoint PPT Presentation
Citation preview
1
Relation Mapping
EJB 3.0 コース第 9 回
2006 年 8 月 6 日
2
ここでの目標 複数のテーブルを組み合わせてデータに
アクセスする「 Relation Mapping 」について理解する
3
一対一の関係 : @OneToOne
4
一対一の関係 :従業員と自宅の住所
EJB_EMPLOYEE 社員テーブル
ADDRESS_ID STREET CITY PROVINCE P_CODE COUNTRY
EJB_ADDRESS 住所テーブル
EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID
EJB_EMPLOYEE 社員テーブル
309 3 丸山 不二夫 829 123
829 冨岡 稚内 北海道 097-0012 日本
5
住所の ID から住所を得る
EMP_ID VERSION L_NAME F_NAME ADDR_ID
@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; } }
6
カスケード処理 テーブル間の関連があるときに、処理を伝
播させる ( カスケードさせる ) ことが可能 テーブル間の関係が親子関係のときに利用 関連に用いるアノテーション (*To*) と cas
cade public enum CascadeType{ ALL, PERSIST, MERGE, REMOVE, REFRESH};
@OneToMany(cascade=CascadeType.ALL)public Collection<MailAddress> getMailAddresses(){…}
7
関連インスタンスのロード 関連インスタンスのロードのタイミングを指定できる
即時 (eager) ロード:ソースがロードされると、ターゲットも同時にロード
遅延 (lazy) ロード:ターゲットがアクセスされたときにロード
*To* アノテーションと fetch メンバ OneToOne 、 ManyToOne のデフォルトは EAGER OneToMany 、 ManyToMany のデフォルトは LAZY
• * ToMany は、ロードするインスタンスが多数になるため
@ManyToOne(fetch=FetchType.EAGER)public Studen getOwner() {…}
8
社員の住所の取得public Address getAddressForEmployee(Integer em
ployeeId) { Employee employee =
em.find(Employee.class, employeeId);
return employee.getAddress();}
9
@ManyToOne
10
多対一の関係 :メールアドレスと学生
ID Name
Student 学生テーブル
Address Student ID
MailAddress メールアドレステーブル
309 丸山不二夫
11
Student.java
@Entity@Table(name = "student")public class Student {
@Id @Column(name="id")public int getId() {...}public void setId(int id) {...}
@Column(name="name")public String getName() {...}public void setName(String name) {...}
}
12
MailAddress.java@Entity@Table(name = "mail_address")public class MailAddress { @Id @Column(name="address") public String getAddress() {...} public void setAddress(String address) {...}
@ManyToOne(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="student_id",referencedColumnName="id")
public Student getOwner() {...} public void setOwner(Student owner) {...}}
13
メールアドレスから学生を得る
309 丸山 不二夫
@ManyToOne(fetch=FetchType.EAGER) @JoinColumn(name=“student_id", referencedColumnName=“id") public Student getOwner() {…} public void setOwner(Student owner) {…}
14
アドレスの情報から持ち主の学生を得る
@Remotepublic interface MailAddressFacade {
void addMailAddress(int student_id, String address); MailAddress findMailAddressByAddress (String address);
Student findStudentByAddress(String address);}
15
アドレスの情報から持ち主の学生を得る ( 実装 )
public Student findStudentByAddress (String address) { MailAddress mailAddress = (MailAddress)em .find(MailAddress.class, address); return mailAddress.getOwner(); }
16
一対多の関係 : @OneToMany
17
多対一と一対多
ID Name
Student 学生テーブル
Address Student ID
MailAddress メールアドレステーブル
309 丸山 不二夫
18
多対一と一対多 メールアドレスから学生
→ 多対一 (ManyToOne) 学生からメールアドレス
→ 一対多 (OneToMany)
19
Student.java
@Entity@Table(name = "student")public class Student {
@Id @Column(name="id")public int getId() {...}public void setId(int id) {...}@Column(name="name")public String getName() {...}public void setName(String name) {...}
// メールアドレスの情報はどこからとる?}
20
学生からメールアドレスの一覧を得るには?
ID Name
309 丸山 不二夫
@OneToMany(cascade=CascadeType.ALL) @JoinColumn(name=“student_id", referencedColumnName=“id") public Collection<MailAddress> getMailAddresses() { return mailAddresses; }
Address Student ID
21
学生の情報からメールアドレス一覧を得る
@Remotepublic interface StudentFacade { void addStudent(int id, String name); Student findStudentById(int id);
Collection<MailAddress> findMailAddressesById(int id);}
22
学生の情報からメールアドレス一覧を得る ( 実装 )
public Collection<MailAddress> findMailAddressesById(int id)
{Student student =
(Student)em.find( Student.class, id );return student.getMailAddresses();
}
23
多対多の関係 : @ManyToMany
24
多対多の例 ) 学生と履修科目
ID Name
Student 学生テーブル
301 小泉純子
302 安倍晋太
303 武部務
304 麻生次郎
ID Course Name
Teacher Name
Course 科目テーブル
1 Java I 植田龍男
2 Java II 植田龍男
3 Java III 佐賀孝博
4 J2EE I 安藤友晴
25
多対多の場合には中間テーブルが必須
Student ID Course ID
301 1
301 2
302 2
302 3
302 4
303 1
303 3
Association Table
26
Association Table を介した対応
ID NameStudent 学生テーブル
ID Course Name
Teacher NameCourse 科目テーブル
Student ID Course IDAssociation Table
joinColumns=@JoinColumn(name=“Student_ID", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name=“Course_ID", referencedColumnName="ID")
27
ManyToMany の記述の例 @ManyToMany(cascade=CascadeType.ALL) @AssociationTable(
table=@Table(name=“course_regist"), joinColumns=@JoinColumn(
name=“Student_ID", referencedColumnName="ID"), inverseJoinColumns=@JoinColumn( name=“Course_ID", referencedColumnName="ID") ) public Collection<Course> getCourses() {…}
28
学生から履修科目の一覧を取得
public Collection<Course> getCourses() { return courses; } public void setCourses (Collection<Course> courses) { this.courses = courses; }