Relation Mapping EJB 3.0 コース 第9回 2006年8月6日.

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

S2.4 & S2EJB3Unit 中村( taedium ). Seasar 2.4 の特徴 1 Sesar 2.4 は EJB 3.0 を実 装しています。 EJB 3.0 の仕様は 5 月 12 日に Final Release されたばかりの新しい技 術です。
オンラインレポート管理シス テムの開発 藤村研究室 1DS04167N 稲益晃仁. 発表内容 研究の背景 システムの提案 関連研究 システム利用図 利用の流れ ( 管理者、教員、学生 ) 考察.
WebサービスII (第12回)‏ 2007年12月19日 植田龍男.
Apache Camel Data Format Component Apache Camel
JPAを利用した RESTful Webサービスの開発
2006年11月22日 植田龍男 Webサービス II (第9回) 年11月22日 植田龍男.
オブジェクト指向プログラミング(4) 静的分析(2)
Apache Camel Data Format Component Apache Camel
WebサービスII (第10回) 2007年11月28日 植田龍男.
Javaのための暗黙的に型定義される構造体
Servlet J2EE I 第8回 /
SQL J2EE I 第3回 /
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
WebサービスII (第8回) 2007年11月14日 植田龍男.
JavaBeans とJSP データベース論 第5回.
JSFによるWebアプリケーション開発 第6回
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
オブジェクト指向入門.
アプレット プログラミング 第10回 アプレット プログラミング第10回.
アルゴリズムとデータ構造 2011年6月20日
RMI ソフトウェア特論 第6回 /
稚内北星学園大学 情報メディア学部 安藤 友晴
~手続き指向からオブジェクト指向へ[Ⅱ]~
Stateful Session Beans
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
WebサービスII (第7回) 2007年11月7日 植田龍男.
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
2006年度 東京サテライト校 エンタープライズ・アプリケーション II
第6回 2007年6月1日 応用Java (Java/XML).
第11週:super/subクラス、継承性、メソッド再定義
Javaによる Webアプリケーション入門 第6回
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
講義ノート共有データベース NoteTotter?
Java8について 2014/03/07.
2006年11月8日 植田龍男 Webサービス II (第7回) 年11月8日 植田龍男.
アルゴリズムとデータ構造1 2009年7月9日
Javaによる Webアプリケーション入門 第11回
Servlet ソフトウェア特論 第7回.
XML Schema (1) ソフトウェア特論 第3回 /
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
Servlet J2EE I (データベース論) 第12回 /
オブジェクト・プログラミング 第8回.
E-R図 井上卓也.
EntityManager と EJB QL EJB 3.0 コース 第8回 2006年8月5日.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2006年7月4日
C#プログラミング実習 第3回.
Javaによる Webアプリケーション入門 第4回
Annotation EJB 3.0 コース 第3回 2006年8月4日.
WebアプリケーションとTomcat ― これまでの復習とこれからの予習 ―
Action Method の実装 J2EE II 第9回 2004年12月2日.
稚内北星学園大学 情報メディア学部 安藤 友晴
稚内北星学園大学 情報メディア学部 専任講師 安藤 友晴
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年6月21日
やさしく理解するはじめてのJPA JPAの使い方 川場 隆 活水女子大学. やさしく理解するはじめてのJPA JPAの使い方 川場 隆 活水女子大学.
アルゴリズムとデータ構造1 2005年7月12日
アルゴリズムとデータ構造1 2007年7月6日
SQL J2EE I (データベース論) 第3回 /
2006年10月18日 植田龍男 Webサービス II (第4回) 年10月18日 植田龍男.
応用Java(Java/XML) 第8回 2005年6月9日 植田龍男.
デフォルト引数 長谷川啓.
SQL データベース論 第11回.
Presentation transcript:

Relation Mapping EJB 3.0 コース 第9回 2006年8月6日

ここでの目標 複数のテーブルを組み合わせてデータにアクセスする「Relation Mapping」について理解する

一対一の関係: @OneToOne

一対一の関係: 従業員と自宅の住所 EJB_EMPLOYEE 社員テーブル EJB_EMPLOYEE 社員テーブル EMP_ID VERSION L_NAME F_NAME ADDR_ID MANAGER_ID EJB_EMPLOYEE 社員テーブル 309 3 丸山 不二夫 829 123 829 冨岡 稚内 北海道 097-0012 日本 EJB_ADDRESS 住所テーブル ADDRESS_ID STREET CITY PROVINCE P_CODE COUNTRY

住所の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; } }

カスケード処理 テーブル間の関連があるときに、処理を伝播させる (カスケードさせる) ことが可能 テーブル間の関係が親子関係のときに利用 関連に用いるアノテーション (*To*) とcascade public enum CascadeType{ ALL, PERSIST, MERGE, REMOVE, REFRESH }; @OneToMany(cascade=CascadeType.ALL) public Collection<MailAddress> getMailAddresses(){…}

関連インスタンスのロード 関連インスタンスのロードのタイミングを指定できる *To*アノテーションとfetchメンバ 即時 (eager) ロード:ソースがロードされると、ターゲットも同時にロード 遅延 (lazy) ロード:ターゲットがアクセスされたときにロード *To*アノテーションとfetchメンバ OneToOne、 ManyToOneのデフォルトはEAGER OneToMany、ManyToManyのデフォルトはLAZY *ToManyは、ロードするインスタンスが多数になるため @ManyToOne(fetch=FetchType.EAGER) public Studen getOwner() {…}

社員の住所の取得 public Address getAddressForEmployee(Integer employeeId) { Employee employee = em.find(Employee.class, employeeId); return employee.getAddress(); }

@ManyToOne

多対一の関係: メールアドレスと学生 Student 学生テーブル MailAddress メールアドレステーブル ID Name 309 丸山不二夫 marymama@wakhok.ac.jp 309 maru@docomo.ne.jp 309 maruchan@yahoo.co.jp 309 MailAddress メールアドレステーブル Address Student ID

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

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

メールアドレスから学生を得る @ManyToOne(fetch=FetchType.EAGER) marymama@wakhok.ac.jp 309 309 丸山 不二夫 @ManyToOne(fetch=FetchType.EAGER) @JoinColumn(name=“student_id", referencedColumnName=“id") public Student getOwner() {…} public void setOwner(Student owner) {…}

アドレスの情報から持ち主の学生を得る @Remote public interface MailAddressFacade { void addMailAddress(int student_id, String address); MailAddress findMailAddressByAddress (String address); Student findStudentByAddress(String address); }

アドレスの情報から持ち主の学生を得る (実装) public Student findStudentByAddress (String address) { MailAddress mailAddress = (MailAddress)em .find(MailAddress.class, address); return mailAddress.getOwner(); }

一対多の関係: @OneToMany

多対一と一対多 Student 学生テーブル MailAddress メールアドレステーブル ID Name 309 丸山 不二夫 marymama@wakhok.ac.jp 309 maru@docomo.ne.jp 309 maruchan@yahoo.co.jp 309 MailAddress メールアドレステーブル Address Student ID

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

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) {...} // メールアドレスの情報はどこからとる? }

学生からメールアドレスの一覧を得るには? ID Name Address Student ID 309 丸山 不二夫 maru@docomo.ne.jp 309 marymama@wakhok.ac.jp 309 @OneToMany(cascade=CascadeType.ALL) @JoinColumn(name=“student_id", referencedColumnName=“id") public Collection<MailAddress> getMailAddresses() { return mailAddresses; }

学生の情報からメールアドレス一覧を得る @Remote public interface StudentFacade { void addStudent(int id, String name); Student findStudentById(int id); Collection<MailAddress>       findMailAddressesById(int id); }

学生の情報からメールアドレス一覧を得る (実装) public Collection<MailAddress>    findMailAddressesById(int id) { Student student = (Student)em.find( Student.class, id ); return student.getMailAddresses(); }

多対多の関係: @ManyToMany

多対多の例) 学生と履修科目 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 安藤友晴

多対多の場合には中間テーブルが必須 Association Table Student ID Course ID 301 1 301 2 302 2 302 3 302 4 303 1 303 3

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

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

学生から履修科目の一覧を取得 public Collection<Course> getCourses() { return courses; } public void setCourses (Collection<Course> courses) { this.courses = courses;