1 relation mapping ejb 3.0 コース 第 9 回. 2 ここでの目標...

27
1 Relation Mapping EJB 3.0 コココ コ9コ

Upload: antony-walsh

Post on 29-Jan-2016

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

1

Relation Mapping

EJB 3.0 コース第 9 回

Page 2: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

2

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

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

Page 3: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

3

@OneToOne Annotation

Page 4: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

4

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: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

5

EMP_ID VERSION L_NAME F_NAME ADDR_ID

EJB_EMPLOYEE 社員テーブル

@Entity@Table(name="EJB_EMPLOYEE")public class Employee implements Serializable {…… @Id @Column(name="EMP_ID", primaryKey=true) public Integer getId() { return id; } …… @Version @Column(name="VERSION") public int getVersion() { return version; } …… @Column(name="L_NAME", length=80) public String getLastName() { return lastName; } …… @Column(name=“F_NAME", length=80) public String geFirstName() { return firstName; } …… @OneToOne(cascade=ALL, fetch=LAZY) @JoinColumn(name="ADDR_ID") public Address getAddress() { return address; } ……}

Page 6: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

6

ADDRESS_ID STREET CITY PROVINCE P_CODE COUNTRY

EJB_ADDRESS 住所テーブル

@Entity@Table(name="EJB_ADDRESS")public class Address implements Serializable {….. @Id @Column(name="ADDRESS_ID", primaryKey=true) public Integer getId() { return id; } …. public void setId(Integer id) { this.id = id; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } @Column(name="P_CODE") public String getPostalCode() { return postalCode; }…. public String getCountry() { return country; } public void setCountry(String country) { this.country = country; }}

Default 名

Page 7: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

7

public Address getAddressForEmployee(Integer employeeId) { Employee employee = (Employee)em .find("Employee", employeeId); return employee.getAddress();}

社員のアドレスの取得

public void updateAddress(Address addressExample) { em.find("Address", addressExample.getId()); em.merge(addressExample);}

public void setAddressForEmployee    (Address address, Integer employeeId) { em.persist(address); Employee employee =        (Employee)em.find("Employee", employeeId); employee.setAddress(address);}

Page 8: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

8

@ManyToOne Annotation

Page 9: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

9

EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID

EJB_EMPLOYEE 社員テーブル

多対一の関係の例:複数の社員が一人の上司を持つ

309 3 丸山 不二夫 829 123

EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID

EJB_EMPLOYEE 社員テーブル

401 3 王子 東 6605 309

402 3 山田 和夫 6606 309

Page 10: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

10

EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID

EJB_EMPLOYEE 社員テーブル

@Entity@Table(name="EJB_EMPLOYEE")public class Employee implements Serializable {…… @Id @Column(name="EMP_ID", primaryKey=true) public Integer getId() { return id; } …… @Version @Column(name="VERSION") public int getVersion() { return version; } …… @Column(name="L_NAME", length=80) public String getLastName() { return lastName; } …… @Column(name=“F_NAME", length=80) public String geFirstName() { return firstName; } …… @OneToOne @JoinColumn(name="ADDR_ID") public Address getAddress() { return address; } …… @ManyToOne(cascade=PERSIST, fetch=LAZY) @JoinColumn(name="MANAGER_ID",referencedColumnName="EMP_ID") public Employee getManager() { return manager; } ……}

Page 11: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

11

public Employee getManagerForEmployee(Integer employeeId) { Employee employee = (Employee)em.find("Employee", employeeId); Employee manager = employee.getManager(); if (manager != null) { manager.getAddress(); manager.getManager(); } return manager; }

社員の上司の取得

Page 12: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

12

@OneToMany Annotation

Page 13: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

13

EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID

EJB_EMPLOYEE 社員テーブル

一対多の関係の例:一人が複数の部下を持つ

309 3 丸山 不二夫 829 123

EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID

EJB_EMPLOYEE 社員テーブル

401 3 王子 東 6605 309

402 3 山田 和夫 6606 309

Page 14: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

14

public Collection    getManagedEmployeesForEmployee(   Integer employeeId) { Employee employee =        (Employee)em.find("Employee", employeeId); Collection employees = employee.getManagedEmployees(); Iterator employeeIterator = employees.iterator(); while (employeeIterator.hasNext()) { Employee mEmployee =          (Employee)employeeIterator.next(); mEmployee.getAddress(); mEmployee.getManager(); } return employees; }

社員の部下(複数)の取得

@OneToMany@JoinColumn(name="MANAGER_ID", referencedColumnName="EMP_ID")public Collection<Employee> getManagedEmployees() { return managedEmployees; }

Page 15: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

15

EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID

EJB_EMPLOYEE 社員テーブル

一対多の関係の例:一人が複数の電話を持つ

ID NUMB CITY TYPE AREA_CODE OWNER_ID

EJB_PHONENUMBER 電話番号テーブル

309 3 丸山 不二夫 829 123

1 7511 32 職場 0162 309

3 43xx 86xx 携帯 090 309

2 81xx 33 自宅 0162 309

Page 16: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

16

ID NUMB CITY TYPE AREA_CODE OWNER_ID

EJB_PHONENUMBER 電話番号テーブル

@Entity@Table(name="EJB_PHONENUMBER")public class PhoneNumber implements Serializable { @Id @Column(name="ID", primaryKey=true) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="NUMB") public String getNumber() { return number; } public void setNumber(String number) { this.number = numbe} public String getType() { return type; } public void setType(String type) { this.type = type; } @Column(name="AREA_CODE") public String getAreaCode() { return areaCode; } public void setAreaCode(String areaCode) { this.areaCode = areaCode; } @ManyToOne(fetch=LAZY) @JoinColumn(name="OWNER_ID", referencedColumnName="EMP_ID") public Employee getOwner() { return owner; } public void setOwner(Employee owner) { this.owner = owner; }}

Page 17: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

17

EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID

EJB_EMPLOYEE 社員テーブル

@Entity@Table(name="EJB_EMPLOYEE")public class Employee implements Serializable {…… @Id @Column(name="EMP_ID", primaryKey=true) public Integer getId() { return id; } …… @Version @Column(name="VERSION") public int getVersion() { return version; } …… } …… @OneToOne @JoinColumn(name="ADDR_ID") public Address getAddress() { return address; } …… @ManyToOne @JoinColumn(name="MANAGER_ID",referencedColumnName="EMP_ID") public Employee getManager() { return manager; } @OneToMany(cascade=ALL) @JoinColumn(name="OWNER_ID", referencedColumnName="EMP_ID") public Collection<PhoneNumber> getPhoneNumbers() { return phoneNumbers; }}

Page 18: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

18

public Collection     getPhoneNumbersForEmployee(Integer employeeId) { Employee employee =         (Employee)em.find("Employee", employeeId); Collection phoneNumbers = employee.getPhoneNumbers(); Iterator pIterator = phoneNumbers.iterator(); while (pIterator.hasNext()) { PhoneNumber pNumber =           (PhoneNumber)pIterator.next(); pNumber.getOwner(); } return phoneNumbers; }

社員の電話番号(複数)の取得

Page 19: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

19

@ManyToMany Annotation

Page 20: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

20

PROJ_ID VERSION PROJ_NAME DESCRIP LEADER_ID

EJB_PROJECT プロジェクトテーブル

@Entity@Table(name="EJB_PROJECT")public class Project implements Serializable { @Id @Column(name="PROJ_ID", primaryKey=true) public Integer getId() { return projId; } public void setId(Integer id) { this.projId = id; } @Version @Column(name="VERSION") public int getVersion() { return version; } protected void setVersion(int version) { this.version = version; } @Column(name="PROJ_NAME") public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name="DESCRIP") public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @OneToOne(fetch=LAZY) @JoinColumn(name="LEADER_ID") public Employee getTeamLeader() { return teamLeader; } public void setTeamLeader(Employee teamLeader) {…. }}

Page 21: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

21

EJB_PROJ_EMP

EMP_ID PROJ_IDAssociation Table

401 王子 101 EJB プロジェクト401 王子 102 Web プロジェクト402 山田 102 Web プロジェクト402 山田 103 UML プロジェクト403 川添 103 UML プロジェクト403 川添 101 EJB プロジェクト309 丸山 101 EJB プロジェクト309 丸山 102 Web プロジェクト309 丸山 103 UML プロジェクト

多対多の関係の例:社員のプロジェクトへの所属

Page 22: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

22

EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID

EJB_EMPLOYEE 社員テーブル

401 3 王子 東 6605 309

402 3 山田 和夫 6606 309

403 3 川添 真知子 6607 309

PROJ_ID VERSION PROJ_NAME DESCRIP LEADER_ID

EJB_PROJECT プロジェクトテーブル

103 3 UMLプロジェクト

UML…. 403

102 3 Webプロジェクト

Web…. 402

101 3 EJBプロジェクト

EJB…. 401

Page 23: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

23

EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID

EJB_EMPLOYEE 社員テーブル

多対多の関係の表現: Association Table

PROJ_ID VERSION PROJ_NAME DESCRIP LEADER_ID

EJB_PROJ_EMP EMP_ID PROJ_ID

EJB_PROJECT プロジェクトテーブル

Association Table

joinColumns=@JoinColumn(name="EMP_ID", referencedColumnName="EMP_ID"),

inverseJoinColumns=@JoinColumn(name="PROJ_ID", referencedColumnName="PROJ_ID")

Page 24: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

24

public void createProject(String name, String description) { Project project= new Project(); project.setName(name); project.setDescription(description); em.persist(project); }

プロジェクトの生成

@ManyToMany(cascade=PERSIST)@AssociationTable(table=@Table(name="EJB_PROJ_EMP"), joinColumns=@JoinColumn(name="EMP_ID", referencedColumnName="EMP_ID"), inverseJoinColumns=@JoinColumn(name="PROJ_ID", referencedColumnName="PROJ_ID"))public Collection<Project> getProjects() { return projects; }public void setProjects(Collection<Project> projects) { this.projects = projects; }

Page 25: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

25

public void addEmployeeToProject( Integer employeeId, Integer projectId) { Employee employee = (Employee)em.find("Employee", employeeId); Project project = (Project)em.find("Project", projectId); project.addTeamMember(employee); employee.addProject(project); }

プロジェクトへの社員の追加

Page 26: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

26

public Collection getEmployeesForProject(Integer projectId){ Project project = (Project)em.find(“Project”, projectId); Iterator employeeIterator = project.getTeamMembers().iterator();

while (employeeIterator.hasNext()) { Employee employee = (Employee)employeeIterator.next(); employee.getAddress(); employee.getManager(); } return project.getTeamMembers();}

プロジェクト所属の社員の獲得

Page 27: 1 Relation Mapping EJB 3.0 コース 第 9 回. 2 ここでの目標 複数のテーブルを組み合わせてデータに アクセスする「 Relation Mapping 」につ いて理解する

27

public void removeEmployee(Integer employeeId) { Employee employee = (Employee) em.find("Employee", employeeId); Collection<Project> projects = employee.getProjects(); for (Project project : projects) { project.removeTeamMember(employee); } Collection<Employee> employees = employee.getManagedEmployees(); for (Employee emp : employees) { emp.setManager(null); } Employee manager = employee.getManager(); if (manager != null) { manager.removeManagedEmployee(employee); } em.remove(employee);}

社員登録の削除