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 <-インデックス情報の確認。他にもメタテーブル有。