relation mapping

Post on 21-Jan-2016

45 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

TRANSCRIPT

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 丸山不二夫

marymama@wakhok.ac.jp 309

maruchan@yahoo.co.jp 309

maru@docomo.ne.jp 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 丸山 不二夫

marymama@wakhok.ac.jp 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 丸山 不二夫

marymama@wakhok.ac.jp 309

maruchan@yahoo.co.jp 309

maru@docomo.ne.jp 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

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

maru@docomo.ne.jp 309

ID Name

309 丸山 不二夫

marymama@wakhok.ac.jp 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; }

top related