Dali JPA Tools さわってみました その2

やはり、昨日はFKの定義を忘れていました(というか、定義されていると思い込んでましたorz)。リレーションシップの設定してくれなくて当然でしたね。
改めて試してみたところリレーションシップのマッピング定義も生成されました。生成されたコードは下の方にコピペしておきます。ちゃんと@ManyToOneや@OneToManyがついています。

あと他に気づいたところ
  • 複合キーに対応している。
    • @Embeddableなクラスもつくってくれる。複合主キーを参照するFKがあればリレーションシップのマッピングも作ってくれる。
  • 生成されたエンティティにテーブル上にないプロパティを追加した場合、「テーブルにないよ」と怒ってくれる。
    • ただ、@Transientつけても認識されない、まだ怒られる。transient修飾子は認識される。
  • 継承関連のマッピングは結構ちゃんとサポートされてそう。あまり使わないと思うけど。

ということで、Dali使えるんじゃないんでしょうか。
本当はエンティティからテーブルを作成してくれる機能があると手軽にJPAが試せていいのですけどね。
エンティティからテーブルの生成ってNetBeansはサポートしているのでしたっけ?

テーブル定義と生成されたエンティティのコード(一部省略しています)。

DDL
CREATE TABLE DEPT (
		ID INTEGER NOT NULL,
		DEPTNO INTEGER NOT NULL,
		DEPTNAME VARCHAR(20) ,
		LOC VARCHAR(20) ,
		VERSIONNO INTEGER 
	);

ALTER TABLE DEPT ADD CONSTRAINT DEPT_PK PRIMARY KEY (ID);

CREATE TABLE EMP (
		ID INTEGER NOT NULL,
		EMPNO INTEGER NOT NULL,
		EMPNAME VARCHAR(20) ,
		MGR_ID INTEGER ,
		HIREDATE DATE ,
		DEPT_ID INTEGER ,
		VERSIONNO INTEGER 
	);

ALTER TABLE EMP ADD CONSTRAINT EMP_PK PRIMARY KEY (ID);
ALTER TABLE EMP ADD CONSTRAINT EMP_FK1 FOREIGN KEY ( MGR_ID) REFERENCES EMP (ID) ;
ALTER TABLE EMP ADD CONSTRAINT EMP_FK2 FOREIGN KEY (DEPT_ID)  REFERENCES DEPT (ID) ;
以下は生成されたクラス
@Entity
public class Dept implements Serializable {
	@Id
	private int id;

	private int versionno;

	private String loc;

	private int deptno;

	private String deptname;

	@OneToMany(mappedBy = "dept")
	private Set<Emp> empCollection;

  // setterとgetterは省略

}
@Entity
public class Emp implements Serializable {
	@Id
	private int id;

	private int empno;

	private String empname;

	private int versionno;

	private Date hiredate;

	@ManyToOne
	private Dept dept;

	@ManyToOne
	private Emp mgr;

	@OneToMany(mappedBy="mgr")
	private Set<Emp> empCollection;

  // setterとgetterは省略
}