Gen-Ddlで外部キー生成を抑制するアイデア

id:mokkouyou2001さんが現在比較中2というエントリでS2JDBCDBFluteを比較しています(おもしろいです)。

その中で、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);


現状でも、独自に拡張してもらえれば外部キーを作成するしないは制御できますが、もっと手軽にやりたいですね。以下のようなかんじで考えてみました。

ということで、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など好きな名前にできます。