今日は午後からOracleで開催された「WebLogic Server 12c Forum 2013~ Java EEの現在と未来、WebLogicが拓く新たな可能性 ~」に参加してきました。今週はJenkins勉強会、Java x HTML5 Nightと参加したので、週3でOracleに…(^^;
セミナー内容は明日にでも簡単に触れようかなと思います。
で、上記セミナーで寺田さんの発表をみていたら、デモ動画の中で、NetBeansを使ってEntityからテーブルのカラムを追加して反映させる、というのが出てきて「えっ、そんなのできるの!?」と初めて知りました(^^;
私はDDL書いて、テーブルを先に作って「データベースからのエンティティクラス」メニューを使ってEntityクラスを生成する、というのはよく使っています。
この一方向しかできないかと勝手に思っていたので、実は地味に衝撃でした。
手元にノートPCを持っていたので試したのですが、同じことができず、セミナー終了後、寺田さんにやり方を教えて頂きました(^^;ありがとうございました。
persistence.xmlをダブルクリックすると「ドロップして作成」という選択があるので、これを入れるだけでできるとのことで、帰宅後、実際に試してみました。
お試し環境
IDE:NetBeans 7.2.1
DB:Java DB(Apache Derby)
以下のお試しでは「データベースからエンティティクラス」を試した後、「エンティティクラスからテーブル」を試します。
具体的には
- テーブル作成&カラム定義
- テーブルからエンティティクラスを自動生成
- persistence.xmlを修正
- テーブルを削除
- エンティティクラスからテーブルを自動生成
- エンティティクラスからテーブルのカラムを追加
をやってみました。青字の部分がメインの設定ですね。
テーブル作成&カラム定義
NetBeansの左ウィンドウ「サービス」タブからJava DBの対象DBを開いて「コマンドの実行」を選択します。
以下create文でテーブルを作成します。
create table Book (
BookId varchar(64) primary key,
BookName varchar(512)
)
テーブルができました。
テーブルからエンティティクラスを自動生成
「プロジェクト」タブに戻って、Entityを追加するパッケージを右クリックして、「新規」メニューから「その他」を選択し、あとは図のように選んでいきます。
対象のデータソースを選んで、エンティティを作成するテーブルを選択します。
あとはとりあえずそのままでいきます。
以下Entityのクラスが自動生成されました。
package jp.co.hoge.entity;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
@author
@Entity
@Table(name = "BOOK")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Book.findAll", query = "SELECT b FROM Book b"),
@NamedQuery(name = "Book.findByBookid", query = "SELECT b FROM Book b WHERE b.bookid = :bookid"),
@NamedQuery(name = "Book.findByBookname", query = "SELECT b FROM Book b WHERE b.bookname = :bookname")})
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 64)
@Column(name = "BOOKID")
private String bookid;
@Size(max = 512)
@Column(name = "BOOKNAME")
private String bookname;
public Book() {
}
public Book(String bookid) {
this.bookid = bookid;
}
public String getBookid() {
return bookid;
}
public void setBookid(String bookid) {
this.bookid = bookid;
}
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
@Override
public int hashCode() {
int hash = 0;
hash += (bookid != null ? bookid.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
TODO
if (!(object instanceof Book)) {
return false;
}
Book other = (Book) object;
if ((this.bookid == null && other.bookid != null) || (this.bookid != null && !this.bookid.equals(other.bookid))) {
return false;
}
return true;
}
@Override
public String toString() {
return "jp.co.kke.entity.Book[ bookid=" + bookid + " ]";
}
}
persistence.xmlを修正
persistence.xmlをダブルクリックして、「表作成の方針」を「ドロップして作成」にします。なるほどー、こんな設定があったのですね。気づかなかった…。
テーブルを削除
では、今作ったテーブルをわざと手で消してみましょう。えいやっ。
エンティティクラスからテーブルを自動生成
実行すると…おー、消したテーブルがエンティティクラスから生成されてる!すごい。
エンティティクラスからテーブルのカラムを追加
続いてエンティティクラスのフィールドを追加(カラムとして)して実行すると…
テーブルのカラムもできてるー!
これは便利です(^^)/寺田さん教えて頂いて、ありがとうございました!
なお、これで色々いじるとDDLなくて困る…?って思わずつぶやいたら@megascusさんより「DDLは作成されたテーブルから作成すれば良いですね。」とコメント頂きました。確かにその通りですね(^^;
注意点
persistence.xmlの設定にも書いてあったように「ドロップして」なので、既存データは消えてしまうので、実際に試す方はそこだけご注意下さい(^^;
とはいえ、何かと便利なのではないかなーと思って、教えて頂いた内容を(勝手に;)ネタにさせて頂きました。