Gen-Ddlで外部キー生成を抑制するアイデア
id:mokkouyou2001さんが現在比較中2というエントリでS2JDBCとDBFluteを比較しています(おもしろいです)。
その中で、S2JDBC-Genの弱点をつかれてしまいました ><。
制約がない場合の結合
Entityにアノテーションとフィールドを適切に設定すれば動くS2JDBCが素晴らしいのですが、
gen-ddlタスクなどにより、DBに制約を設定してしまうのは致命的。
dbfluteに関しては、設定ファイル(additionalForeignKeyMap.dfprop)
により、仮想的なキーを作成して、制約があるようにソースを生成してくれるのでDBは汚さない。
どういうことかというと、S2JDBC-GenのGen-Ddlタスクは下記のエンティティクラスから
@Entity public class Employee { @Id public Integer id; public Integer departmentId; @ManyToOne public Department department; }
次のような外部キー作成のDDLを生成しますが、必ずしも外部キーを勝手に作ってほしくないということですね。
alter table EMPLOYEE add constraint EMPLOYEE_FK1 foreign key (DEPARTMENT_ID) references DEPARTMENT (ID);
現状でも、独自に拡張してもらえれば外部キーを作成するしないは制御できますが、もっと手軽にやりたいですね。以下のようなかんじで考えてみました。
- 設定ファイルではなくアノテーションを使って外部キーの生成を抑制したい
- でも、JPAのアノテーションにはそれにふさわしいアノテーションがない
- かといって、S2JDBCで独自のアノテーションを提供するのはイヤだ(個人的には)
- プロジェクトごとに好きなアノテーションを使ってもらうのがいいのでは?
ということで、AntのGen-Ddlタスクではプロジェクトごとに作成した任意のアノテーションを指定してもらって、
<gen-ddl ... suppressFkGennerationClassName="example.SuppressFkGeneration" >
こんな感じで使うのはどうでしょう?
@Entity public class Employee { @Id public Integer id; public Integer departmentId; @SuppressFkGeneration @ManyToOne public Department department; }
この例では@SuppressFkGenerationとしてみましたが、@Virtualや@LogicalMappingなど好きな名前にできます。