データの登録

今回はデータの登録です。

【前提条件】

[環境]
[その他]
  • JPAの設定が完了している*1

【概要】

テーブルへエンティティを登録といっても難しいことはしません。
EntityManager#persistメソッドにエンティティクラスのオブジェクトを渡すだけです。

【サンプルコード】

[テーブル]

前回に作成した「sales」テーブルを使います。
テーブルの定義は前回と変わっていません。

CREATE TABLE sales
(
    user_id character varying(10) NOT NULL,
    goods_code character varying(5) NOT NULL,
    number_of_articles integer,
    CONSTRAINT sales_primary_key PRIMARY KEY (user_id , goods_code )
)
[Entity]

エンティティのクラスです。
前回のSales1からIdClassの指定を除いたものです。
登録用にシンプルにしただけのもです。

package jp.glory.persistence.entity;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "sales")
public class Sales implements Serializable {

    private static final long serialVersionUID = 1067393173514970977L;

    @Id
    @Column(name = "user_id")
    private String userId = null;

    @Id
    @Column(name = "goods_code")
    private String goodsCode = null;

    @Column(name = "number_of_articles")
    private int numberOfArticles = 0;

    // アクセサメソッドは省略
}
[登録クラス]

登録を行うクラスです。

package jp.glory.ui;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import jp.glory.persistence.entity.Sales;

@ManagedBean(name = "salesEntryPage")
@RequestScoped
public class SalesEntryPage {

    private String userId = null;

    private String goodsCode = null;

    private Integer numberOfArticles = null;

    public void entry() {

        final EntityManagerFactory factory = Persistence.createEntityManagerFactory("blog");
        final EntityManager manager = factory.createEntityManager();

        final Sales salesData = new Sales();
        salesData.setUserId(userId);
        salesData.setGoodsCode(goodsCode);
        salesData.setNumberOfArticles(numberOfArticles);

        final EntityTransaction transaction = manager.getTransaction();

        transaction.begin();
        manager.persist(salesData);
        transaction.commit();

        // 登録が終わったのでデータ初期化
        userId = null;
        goodsCode = null;
        numberOfArticles = null;
    }

    // アクセサメソッドは省略
}

EntityManager#persistメソッドにエンティティクラスを渡すだけです。
今回はSalesクラスのオブジェクトを渡しています。

トランザクションの制御は
javax.persistence.EntityTransactionクラスを使用しています。
(実際のシステムでは毎回生成せずにEJBによる
トランザクション管理を行うことになると思います。)

[ページ]

登録用のページです。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html">
    <f:view>
        <h:head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <title>登録サンプル</title>
        </h:head>
        <h:body>
            <h:form id="entryForm">
                <div>
                    ユーザID:<h:inputText id="userId" value="#{salesEntryPage.userId}" />
                </div>
                <div>
                    商品コード:<h:inputText id="goodsCode" value="#{salesEntryPage.goodsCode}" />
                </div>
                <div>
                    個数:<h:inputText id="numberOfArticles" value="#{salesEntryPage.numberOfArticles}" />
                </div>
                <div>
                    <h:commandButton action="#{salesEntryPage.entry()}" value="登録" />
                </div>
            </h:form>
        </h:body>
    </f:view>
</html>

【実行】

画面に必要なデータを入力して、登録ボタンをクリックします。

登録が完了すると入力データがリセットされます。

テーブルを見るとデータが登録されていることがわかります。
(キャプチャでは3つめのデータです)

【おまけ】

前回の組み込みIDクラスを使った場合の登録です。

package jp.glory.ui;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import jp.glory.persistence.entity.Sales2;
import jp.glory.persistence.key.EmbeddedIdSalesKey;

@ManagedBean(name = "salesEntryPage")
@RequestScoped
public class SalesEntryPage {

    private String userId = null;

    private String goodsCode = null;

    private Integer numberOfArticles = null;

    public void entry() {

        final EntityManagerFactory factory = Persistence.createEntityManagerFactory("blog");
        final EntityManager manager = factory.createEntityManager();

        final Sales2 salesData = new Sales2();
        EmbeddedIdSalesKey key = new EmbeddedIdSalesKey();
        key.setUserId(userId);
        key.setGoodsCode(goodsCode);
        salesData.setKey(key);
        salesData.setNumberOfArticles(numberOfArticles);

        final EntityTransaction transaction = manager.getTransaction();

        transaction.begin();
        manager.persist(salesData);
        transaction.commit();

        // 登録が終わったのでデータ初期化
        userId = null;
        goodsCode = null;
        numberOfArticles = null;
    }

    // アクセサメソッドは省略
}