■
ManyToOneで検索して内容を確認する。
この前のEmployeeに ↓を追加
@ManyToOne @JoinColumn(name="DEPT_ID") private Department department;
EmployeeテーブルにDEPT_IDを追加し、FKを設ける。
そのDEPT_IDに対応する新しくDepartmentのテーブルとクラスを作る。Employeeと同じ内容でFreeLanceというテーブルとクラスも作る。FreeLanceも同様にManyToOneでDepartmentと関係がある。
・・・・ Employee emp = em.find(Employee.class, 1); Department dep1 = emp.getDepartment(); FreeLance freelance = em.find(FreeLance.class, 1); Department dep2 = freelance.getDepartment(); System.out.println(dep1==dep2); ・・・・
、てやって、両方のID=1のレコードが参照しているDepartmentのレコードが同一のレコードの場合、ちゃんと「true」で出力。んでもってログをみると、
(persistence.xmlに、
[TopLink Fine]: 2006.08.04 12:16:11.312--ServerSession(21846985)--Connection(13737183)== Thread(Thread[main,5,main])==SELECT ID, NAME, DEPT_ID FROM EMPLOYEE WHERE (ID = ?) bind => [1] [TopLink Fine]: 2006.08.04 12:16:11.421--ServerSession(21846985)--Connection(21364283)== Thread(Thread[main,5,main])--SELECT ID, NAME FROM DEPARTMENT WHERE (ID = ?) bind => [1] [TopLink Fine]: 2006.08.04 12:16:11.437--ServerSession(21846985)--Connection(13737183)== Thread(Thread[main,5,main])--SELECT ID, NAME, DEPT_ID FROM FREELANCE WHERE (ID = ?) bind => [1]
キャッシュがきいていて2回目のgetDepartmentでのSQLが発行されていないことが確認できまする。
persistent/detachなオブジェクトのライフサイクルはおいおい確認。
JPA Annotationでお世話になるリファレンスはこちら。
途中途中で、デバッグして中身を追いかけるとAnnotationHelperやObjectAccessorなど、思っていたよりもオブジェクトを介在して処理が進んでいく。他JPAと比較しないとわからんけど、もしかしたらテーブルの構造の複雑さ/レコード件数によって、各JPAの実装で性能面などで、違いがでてくるかも。体感的なちがいかどうかは、今度、確認する。
今日のH2コマンド
ALTER TABLE EMPLOYEE ADD DEPT_ID INT <-BEFORE XXXとかでカラム位置を指定できる。 TRUNCATE TABLE DEPARTMET ALTER TABLE EMPLOYEE ADD CONSTRAINT FK1 FOREIGN KEY(DEPT_ID) REFERENCES DEPARTMENT(ID) select * from INFORMATION_SCHEMA.INDEXES <-インデックス情報の確認。他にもメタテーブル有。