Download presentation
Presentation is loading. Please wait.
1
Relation Mapping EJB 3.0 コース 第9回 2006年8月6日
2
ここでの目標 複数のテーブルを組み合わせてデータにアクセスする「Relation Mapping」について理解する
4
一対一の関係: 従業員と自宅の住所 EJB_EMPLOYEE 社員テーブル EJB_EMPLOYEE 社員テーブル
EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID EJB_EMPLOYEE 社員テーブル 309 3 丸山 不二夫 829 123 829 冨岡 稚内 北海道 日本 EJB_ADDRESS 住所テーブル ADDRESS_ID STREET CITY PROVINCE P_CODE COUNTRY
5
住所のIDから住所を得る @Entity @Table(name="EJB_EMPLOYEE")
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*) とcascade public enum CascadeType{ ALL, PERSIST, MERGE, REMOVE, REFRESH }; @OneToMany(cascade=CascadeType.ALL) public Collection<MailAddress> getMailAddresses(){…}
7
関連インスタンスのロード 関連インスタンスのロードのタイミングを指定できる *To*アノテーションとfetchメンバ
即時 (eager) ロード:ソースがロードされると、ターゲットも同時にロード 遅延 (lazy) ロード:ターゲットがアクセスされたときにロード *To*アノテーションとfetchメンバ OneToOne、 ManyToOneのデフォルトはEAGER OneToMany、ManyToManyのデフォルトはLAZY *ToManyは、ロードするインスタンスが多数になるため @ManyToOne(fetch=FetchType.EAGER) public Studen getOwner() {…}
8
社員の住所の取得 public Address getAddressForEmployee(Integer employeeId) {
Employee employee = em.find(Employee.class, employeeId); return employee.getAddress(); }
9
@ManyToOne
10
多対一の関係: メールアドレスと学生 Student 学生テーブル MailAddress メールアドレステーブル ID Name 309
丸山不二夫 309 309 309 MailAddress メールアドレステーブル Address Student ID
11
Student.java @Entity @Table(name = "student") public class Student {
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 { 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
メールアドレスから学生を得る @ManyToOne(fetch=FetchType.EAGER)
309 309 丸山 不二夫 @ManyToOne(fetch=FetchType.EAGER) @JoinColumn(name=“student_id", referencedColumnName=“id") public Student getOwner() {…} public void setOwner(Student owner) {…}
14
アドレスの情報から持ち主の学生を得る @Remote public 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(); }
17
多対一と一対多 Student 学生テーブル MailAddress メールアドレステーブル ID Name 309 丸山 不二夫
309 309 309 MailAddress メールアドレステーブル Address Student ID
18
多対一と一対多 メールアドレスから学生 →多対一(ManyToOne) 学生からメールアドレス → 一対多(OneToMany)
19
Student.java @Entity @Table(name = "student") public class Student {
public int getId() {...} public void setId(int id) {...} @Column(name="name") public String getName() {...} public void setName(String name) {...} // メールアドレスの情報はどこからとる? }
20
学生からメールアドレスの一覧を得るには?
ID Name Address Student ID 309 丸山 不二夫 309 309 @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name=“student_id", referencedColumnName=“id") public Collection<MailAddress> getMailAddresses() { return mailAddresses; }
21
学生の情報からメールアドレス一覧を得る @Remote public 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(); }
24
多対多の例) 学生と履修科目 Student 学生テーブル Course 科目テーブル ID Name ID Course Name
Teacher Name 301 小泉純子 1 Java I 植田龍男 302 安倍晋太 2 Java II 植田龍男 303 武部務 3 Java III 佐賀孝博 304 麻生次郎 4 J2EE I 安藤友晴
25
多対多の場合には中間テーブルが必須 Association Table Student ID Course ID 301 1 301 2
302 2 302 3 302 4 303 1 303 3
26
Association Table を介した対応
ID Name Student 学生テーブル joinColumns= @JoinColumn(name=“Student_ID", referencedColumnName="ID"), Association Table Student ID Course ID inverseJoinColumns= @JoinColumn(name=“Course_ID", referencedColumnName="ID") Course 科目テーブル ID Course Name Teacher Name
27
ManyToManyの記述の例 @ManyToMany(cascade=CascadeType.ALL)
@AssociationTable( name=“Student_ID", referencedColumnName="ID"), 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;
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.