Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

JPAでEntityからテーブルスキーマを生成する方法を教えて頂きました!

今日は午後から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)

以下のお試しでは「データベースからエンティティクラス」を試した後、「エンティティクラスからテーブル」を試します。
具体的には

  1. テーブル作成&カラム定義
  2. テーブルからエンティティクラスを自動生成
  3. persistence.xmlを修正
  4. テーブルを削除
  5. エンティティクラスからテーブルを自動生成
  6. エンティティクラスからテーブルのカラムを追加

をやってみました。青字の部分がメインの設定ですね。

テーブル作成&カラム定義

NetBeansの左ウィンドウ「サービス」タブからJava DBの対象DBを開いて「コマンドの実行」を選択します。
f:id:kikutaro777:20130201205514j:plain

以下create文でテーブルを作成します。

create table Book (
    BookId varchar(64) primary key,
    BookName varchar(512)
)

テーブルができました。
f:id:kikutaro777:20130201205550j:plain

テーブルからエンティティクラスを自動生成

「プロジェクト」タブに戻って、Entityを追加するパッケージを右クリックして、「新規」メニューから「その他」を選択し、あとは図のように選んでいきます。

f:id:kikutaro777:20130201205632j:plain

対象のデータソースを選んで、エンティティを作成するテーブルを選択します。
f:id:kikutaro777:20130201210033j:plain

あとはとりあえずそのままでいきます。
f:id:kikutaro777:20130201210043j:plain
f:id:kikutaro777:20130201210049j:plain

以下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 kikutaro777
 */
@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: Warning - this method won't work in the case the id fields are not set
        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をダブルクリックして、「表作成の方針」を「ドロップして作成」にします。なるほどー、こんな設定があったのですね。気づかなかった…。
f:id:kikutaro777:20130201210109j:plain

テーブルを削除

では、今作ったテーブルをわざと手で消してみましょう。えいやっ。
f:id:kikutaro777:20130201210118j:plain

エンティティクラスからテーブルを自動生成

実行すると…おー、消したテーブルがエンティティクラスから生成されてる!すごい。
f:id:kikutaro777:20130201210146j:plain

エンティティクラスからテーブルのカラムを追加

続いてエンティティクラスのフィールドを追加(カラムとして)して実行すると…
f:id:kikutaro777:20130201210153j:plain
テーブルのカラムもできてるー!

これは便利です(^^)/寺田さん教えて頂いて、ありがとうございました!

なお、これで色々いじるとDDLなくて困る…?って思わずつぶやいたら@megascusさんより「DDLは作成されたテーブルから作成すれば良いですね。」とコメント頂きました。確かにその通りですね(^^;

注意点

persistence.xmlの設定にも書いてあったように「ドロップして」なので、既存データは消えてしまうので、実際に試す方はそこだけご注意下さい(^^;

とはいえ、何かと便利なのではないかなーと思って、教えて頂いた内容を(勝手に;)ネタにさせて頂きました。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村