28
1 Relation Mapping EJB 3.0 コココ コ9コ 2006 コ 8 コ 6 コ

Relation Mapping

  • 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

Page 1: Relation Mapping

1

Relation Mapping

EJB 3.0 コース第 9 回

2006 年 8 月 6 日

Page 2: Relation Mapping

2

ここでの目標 複数のテーブルを組み合わせてデータに

アクセスする「 Relation Mapping 」について理解する

Page 3: Relation Mapping

3

一対一の関係 : @OneToOne

Page 4: Relation Mapping

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 日本

Page 5: Relation Mapping

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

Page 6: Relation Mapping

6

カスケード処理 テーブル間の関連があるときに、処理を伝

播させる ( カスケードさせる ) ことが可能 テーブル間の関係が親子関係のときに利用 関連に用いるアノテーション (*To*) と cas

cade public enum CascadeType{ ALL, PERSIST, MERGE, REMOVE, REFRESH};

@OneToMany(cascade=CascadeType.ALL)public Collection<MailAddress> getMailAddresses(){…}

Page 7: Relation Mapping

7

関連インスタンスのロード 関連インスタンスのロードのタイミングを指定できる

即時 (eager) ロード:ソースがロードされると、ターゲットも同時にロード

遅延 (lazy) ロード:ターゲットがアクセスされたときにロード

*To* アノテーションと fetch メンバ OneToOne 、 ManyToOne のデフォルトは EAGER OneToMany 、 ManyToMany のデフォルトは LAZY

• * ToMany は、ロードするインスタンスが多数になるため

@ManyToOne(fetch=FetchType.EAGER)public Studen getOwner() {…}

Page 8: Relation Mapping

8

社員の住所の取得public Address getAddressForEmployee(Integer em

ployeeId) { Employee employee =

em.find(Employee.class, employeeId);

return employee.getAddress();}

Page 9: Relation Mapping

9

@ManyToOne

Page 10: Relation Mapping

10

多対一の関係 :メールアドレスと学生

ID Name

Student  学生テーブル

Address Student ID

MailAddress  メールアドレステーブル

309 丸山不二夫

[email protected] 309

[email protected] 309

[email protected] 309

Page 11: Relation Mapping

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) {...}

}

Page 12: Relation Mapping

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) {...}}

Page 13: Relation Mapping

13

メールアドレスから学生を得る

309 丸山 不二夫

[email protected] 309

@ManyToOne(fetch=FetchType.EAGER) @JoinColumn(name=“student_id", referencedColumnName=“id") public Student getOwner() {…} public void setOwner(Student owner) {…}

Page 14: Relation Mapping

14

アドレスの情報から持ち主の学生を得る

@Remotepublic interface MailAddressFacade {

void addMailAddress(int student_id, String address); MailAddress findMailAddressByAddress (String address);

Student findStudentByAddress(String address);}

Page 15: Relation Mapping

15

アドレスの情報から持ち主の学生を得る ( 実装 )

public Student findStudentByAddress (String address) { MailAddress mailAddress = (MailAddress)em .find(MailAddress.class, address); return mailAddress.getOwner(); }

Page 16: Relation Mapping

16

一対多の関係 : @OneToMany

Page 17: Relation Mapping

17

多対一と一対多

ID Name

Student  学生テーブル

Address Student ID

MailAddress  メールアドレステーブル

309 丸山 不二夫

[email protected] 309

[email protected] 309

[email protected] 309

Page 18: Relation Mapping

18

多対一と一対多 メールアドレスから学生

→ 多対一 (ManyToOne) 学生からメールアドレス

→ 一対多 (OneToMany)

Page 19: Relation Mapping

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) {...}

// メールアドレスの情報はどこからとる?}

Page 20: Relation Mapping

20

学生からメールアドレスの一覧を得るには?

[email protected] 309

ID Name

309 丸山 不二夫

[email protected] 309

@OneToMany(cascade=CascadeType.ALL) @JoinColumn(name=“student_id", referencedColumnName=“id") public Collection<MailAddress> getMailAddresses() { return mailAddresses; }

Address Student ID

Page 21: Relation Mapping

21

学生の情報からメールアドレス一覧を得る

@Remotepublic interface StudentFacade { void addStudent(int id, String name); Student findStudentById(int id);

Collection<MailAddress>       findMailAddressesById(int id);}

Page 22: Relation Mapping

22

学生の情報からメールアドレス一覧を得る ( 実装 )

public Collection<MailAddress>    findMailAddressesById(int id)

{Student student =

(Student)em.find( Student.class, id );return student.getMailAddresses();

}

Page 23: Relation Mapping

23

多対多の関係 : @ManyToMany

Page 24: Relation Mapping

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 安藤友晴

Page 25: Relation Mapping

25

多対多の場合には中間テーブルが必須

Student ID Course ID

301 1

301 2

302 2

302 3

302 4

303 1

303 3

Association Table

Page 26: Relation Mapping

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")

Page 27: Relation Mapping

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() {…}

Page 28: Relation Mapping

28

学生から履修科目の一覧を取得

public Collection<Course> getCourses() { return courses; }  public void setCourses (Collection<Course> courses) { this.courses = courses; }