Hibernate 4 でデータベース スキーマからエンティティ クラスをリバース エンジニアリングするのに苦労しました。私のデータベースは実際には Derby データベースですが、読んだ後、Derby には休止状態のリバース エンジニアリングに問題がある可能性があると聞いたので、MySQL データベース接続でエンティティを生成することにしましたが、生成されたエンティティを私のダービー接続(それが意味をなす場合)。
JBoss の Hibernate プラグインがインストールされた SpringToolsSuite があります。データベース開発の観点から、MySQL に正常にリンクするデータ ソースを作成しました。STS/Eclipse 内からテーブルをうまく調べることができます。次に、Hibernate パースペクティブに移動し、コンソール構成をセットアップしました。繰り返しますが、これは成功したように見えます。Hibernate の観点からは、テーブルをブラウズして、データベースのテーブルの列定義を問題なく確認できます。次に、[Hibernate Code Generation Configurations] ダイアログに移動して、新しい構成を作成します。「JDBC 接続からのリバース エンジニア」をチェックし、有効になる 4 つのオプションすべてをチェックします。(現時点で私の評判が低すぎるため、画像を含めることはできません。完全に明確でない場合は申し訳ありません)
リバース エンジニアはこれらの設定で機能し、多くのタスクを実行してくれますが、大きな問題の 1 つは、作成されるエンティティの外部キーに正しく注釈が付けられていないことです。たとえば、Foo があり、Foo の列の 1 つが Bar への外部キーである場合、Foo のエンティティ クラスには次のようなものが表示されると予想されます。
...
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "barid", nullable = false, referencedColumnName="id")
@ForeignKey(name="FK_BarID")
private Bar bar;
...
しかし、私が得たものはあまり役に立ちません:
...
@Column(name = "barid")
@NotNull
private Integer barid;
...
今のところ、Hibernate 4 のリバース エンジニアリング機能を、実際に使用しようとしているスキーマよりも小さなスキーマで動作させることができるかどうかを確認することにしました。できれば、誰かが動作していると報告したもの。グーグルで調べた後、私が抱えている問題とまったく同じ問題を抱えている人を見つけました(ただし、彼の解決策は私の場合には機能しません)オンラインの小さなスキーマの例:
私のバージョンの MySQL の InnoBD エンジンは、外部キーが int だけであることに満足できず、それらが参照していた主キーは bigint だったので、私は彼のスキーマを少し変更しなければなりませんでした。したがって、次のスキーマを使用しています。
create table folder (
id bigint not null auto_increment,
title varchar(100) not null,
primary key (id)
) ENGINE=InnoDB;
create table language (
id bigint not null auto_increment,
name varchar(30),
code varchar(3),
primary key (id)
) ENGINE=InnoDB;
create table document (
id bigint not null auto_increment,
folderId bigint not null,
title varchar(100) not null,
primary key (id),
FOREIGN KEY (folderId) REFERENCES folder(id)
) ENGINE=InnoDB;
create table page (
id bigint not null auto_increment,
version int not null default 1,
documentId bigint not null,
languageId bigint not null default 1,
fileName varchar(100),
primary key (id),
FOREIGN KEY (documentId) REFERENCES document(id),
FOREIGN KEY (languageId) REFERENCES language(id)
) ENGINE=InnoDB;
InnoDB がアクティブで使用されていることを確認しましたが (SHOW TABLE STATUS WHERE NAME = 'TableName'; コマンドを使用)、リンクが示すように問題は解決しません。少なくともこの基本的なスキーマで自分のやりたいことを実行できれば、自分のスキーマを正常に動作させることができると思いますが、何時間も試してみると、スキーマの外部キーを認識させることができないようです。欠けているステップはありますか?ありがとう。