Chapter 32

Entityクラス

kazpgm
kazpgm
2022.01.07に更新

自動作成されたEntityクラスを説明する。

商品情報Entityクラス(Shohin.java)

entity.Shohin.java

package com.kaz01u.demo.entity;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Table;
import org.hibernate.annotations.NotFound;
import org.hibernate.annotations.NotFoundAction;
import com.kaz01u.demo.utils.Elements;
import com.kaz01u.demo.utils.Functions;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

・@Table:テーブル名を指定している。定義ファイルC列1行から自動作成されています。
・@Entity:クラスがエンティティということが認識される。
・@Data:対象クラス内のインスタンス変数に対してgetter/setterでアクセスすることを可能とする。でも、継承を伴う@Dataの場合、警告が出るので、@EqualsAndHashCode(callSuper=false)を記述すると良い。記述しなくてもOKなので記述していない。
・@NoArgsConstructor:デフォルトコンストラクタを自動生成するため使う。
・@AllArgsConstructor:フィールドに対する初期化値を引数にとるコンストラクタを自動生成するため使う。
・@ToString:当クラスの文字列表現のため使う。@Dataですでに@ToStringされているので書かなくても良いが、書いても良いので書いてある。

@Table(name = "shohin")
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Shohin extends AbstractEntity implements Serializable {
    private static final long serialVersionUID = 1L;

・@PrePersist:登録前に実行する。定義エクセルのC列が"登録日時"、"更新日時"の時D列から自動作成されています。★01

    //登録前にタイムスタンプを設定する
    @PrePersist
    public void onPrePersist() {
        setInsdt(new Date());
        setUpdt(new Date());
    }

・@PreUpdate:更新前に実行する。定義エクセルのC列が"更新日時"の時D列から自動作成されています。★02

    //更新前にタイムスタンプを設定する
    @PreUpdate
    public void onPreUpdate() {
        setUpdt(new Date());
    }

・@Id:プライマリキーを指定する。定義エクセルのE列から自動作成されています。

    @Id

・@Column:フィールドに割り当てられるカラム名を指定する。定義エクセルのC列からコメント行、D列からname、G列からlength、F列からnullableを自動作成されています。★03

    // 商品CD
    @Column(name = "products", length = 10, nullable = false)
    private String products; 
    // 商品名
    @Column(name = "productsname", length = 50, nullable = true)
    private String productsname;
    // 業種ID
    @Column(name = "biztype_cd", length = 20, nullable = true)
    private Long biztypeCd;
    // 大分類
    @Column(name = "category_cd", length = 20, nullable = true)
    private String categoryCd;
    // 中分類
    @Column(name = "subcategory_cd", length = 20, nullable = true)
    private String subcategoryCd;
    // 小分類
    @Column(name = "extracategory_cd", length = 20, nullable = true)
    private String extracategoryCd;
    // 公開区分
    @Column(name = "openkbn1", length = 1, nullable = true)
    private String openkbn1;
    // 登録日時
    @Column(name = "insdt",  nullable = false)
    private Date insdt;
    // 更新日時
    @Column(name = "updt",  nullable = false)
    private Date updt;

・エレメント・公開区分の名称をElements.ELEMENTSクラスから取得している。Elements.ELEMENTSクラスは定義ファイルの「コード一覧表」シートの固定値エレメントから自動作成されている。★04

    /**
     * getOpenkbn1Nameメソッド
     * openkbn1の名前を戻す
     * 
     * @return openkbn1の名前
     */
    public String getOpenkbn1Name() {
        return Functions.nvl((Elements.ELEMENTS.get("OPN_KBN")).get(openkbn1));
    }

・DBエレメントのオブジェクトを指定する。定義エクセルのI列がDBエレメントの時自動作成されます。★05
・@NotFound:EntityNotFoundExceptionを防止(Hibernate独自のアノテーション)。存在しないときbiztypeCdObjはnullになる。
・@ManyToOne:多対1である。
・@JoinColumn:結合先テーブルのカラム名を指定する。nameは自テーブルのカラム名、結合先テーブルのカラム名。当Entityの登録更新時に、業種Entityを登録更新するつもりはないので、「insertable = false, updatable = false」にしている。
・Biztype:Biztype(業種Entity)

    @NotFound(action=NotFoundAction.IGNORE)    //EntityNotFoundException防止。(Hibernate独自のアノテーション)  
    @ManyToOne
    @JoinColumn(name="biztype_cd", referencedColumnName = "biztype_cd", insertable = false, updatable = false)
    private Biztype biztypeCdObj = null;

    @NotFound(action=NotFoundAction.IGNORE)    //EntityNotFoundException防止。(Hibernate独自のアノテーション)  
    @ManyToOne
    @JoinColumn(name="category_cd", referencedColumnName = "category_cd", insertable = false, updatable = false)
    private Category categoryCdObj = null;

    @NotFound(action=NotFoundAction.IGNORE)   //EntityNotFoundException防止。(Hibernate独自のアノテーション)
    @ManyToOne

・@JoinColumns:結合先テーブルのカラム名を複数指定する。

    @JoinColumns({
        @JoinColumn(name = "category_cd", referencedColumnName = "category_cd", insertable = false, updatable = false),
        @JoinColumn(name = "subcategory_cd", referencedColumnName = "subcategory_cd", insertable = false, updatable = false)
    })
    private Subcategory subcategoryCdObj = null;

    @NotFound(action=NotFoundAction.IGNORE)    //EntityNotFoundException防止。(Hibernate独自のアノテーション) 
    @ManyToOne
    @JoinColumns({
        @JoinColumn(name = "category_cd", referencedColumnName = "category_cd", insertable = false, updatable = false),
        @JoinColumn(name = "subcategory_cd", referencedColumnName = "subcategory_cd", insertable = false, updatable = false),
        @JoinColumn(name = "extracategory_cd", referencedColumnName = "extracategory_cd", insertable = false, updatable = false)
    })
    private Extracategory extracategoryCdObj = null;

・getID()で主キーを戻す。補足:Subcategoryのように主キーが複数項目で出来ているときは、SubcategoryPKのようにKeyオブジェクトを戻す。

    @Override
    public String getId() {
        return products;
    }
}