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は省略 }