JPA継承関係のマッピング、Enumの使用


ドメインモデルとテーブル


Entityでは、Album、Book、MovieがItemを継承します.

継承ポリシーとして、テーブルポリシーを使用して、Album、Book、Movie情報がItemテーブルに格納されます.DTYPEでAlbum、Book、Movieを区別します.

参考として、継承戦略には以下のような署名戦略もある.結合ポリシーはストレージスペースを有効に使用しますが、クエリーで使用される結合が多いため、単一のテーブルポリシーよりも速度が遅くなります.

推奨されませんが、下図に示すように、クラスごとにテーブルポリシーがあります.

Domain


親エンティティ


@Inheritance
  • は両親の娯楽会社に発表した.
  • 戦略を継承戦略として選択します.
  • 単一テーブルポリシー
  • JOINED:連携戦略
  • TABLE PER CLASS:各クラスのテーブルポリシー
  • @DescrminationColumn
    指定
  • 区切り列
  • 親は、マッピングされた表中の分子クラスに使用される.
  • nameプロパティのデフォルトはDTYPEです.

  • サブエンティティ


    親レベルItemを継承し実現した.
    @DiscriminatorValue
  • エンティティを保存する場合、親をマッピングするテーブルの区切りバーの値
  • を指定します.
  • AlbumはA、BookはB、MovieはMとした.ItemテーブルのDTYPEに格納されます.
  • superを使用して親Itemジェネレータを呼び出し、Itemフィールドの値を初期化します.



    DTO


    DTO


    Album、Book、Movieのすべてのフィールドを含むDTOを作成し、画面からItemの値を取得します.

    ItemDTOに関数を作成し、enumを使用してAlbum、Book、Movie Entityを作成します.

    Enum


    ItemのタイプをA、B、Mの値に分けますが、enumは簡単に作成できます.
    public enum ItemType {
    
        ALBUM("A"),
        BOOK("B"),
        MOVIE("M");
    
        private final String itemTypeKey;
    
        ItemType(String itemTypeKey) {
            this.itemTypeKey = itemTypeKey;
        }
    
    //String인 Item Type Key를 넣으면 ItemType으로 변환해준다.
    //예를 들어 "A"를 넣으면 ItemType인 ALBUM으로 바꿔준다.
        public static ItemType fromString(String itemTypeKey) {
            for (ItemType i : ItemType.values()) {
                if (i.itemTypeKey.equalsIgnoreCase(itemTypeKey)) {
                    return i;
                }
            }
            return  null;
        }
    }

    View


    商品の種類を選べば、種類によってスタイルが異なります.

    var itemMain = {
        init : function () {
    
            var _this = this;
            $("#itemType").on("change", function(){
                    _this.itemTypeChange();
            });
    
            _this.itemTypeChange();
        },
    
        itemTypeChange : function(){
            var itemType = $("#itemType option:selected").val();
    
           switch(itemType){
                case 'A':
                    $("#div-album").css("display", "block");
                    $("#div-book").css("display", "none");
                    $("#div-movie").css("display", "none");
                    break;
    
                case 'B':
                    $("#div-album").css("display", "none");
                    $("#div-book").css("display", "block");
                    $("#div-movie").css("display", "none");
                    break;
    
                case 'M':
                    $("#div-album").css("display", "none");
                    $("#div-book").css("display", "none");
                    $("#div-movie").css("display", "block");
                    break;
           }
        }
    
    }
    
    itemMain.init();

    Controller


    VIEWは、ItemDTOに対してItem情報を受信し、サービスに伝達する.

    Service


    サービス内のItemDTOをEntityに変更し、Repositoryに渡します.

    Repository


    Itemを登録します.

    選択した場合、Item.classに設定しても、DTYPEに従ってAlbum、Book、Movieクラスにデータを入れて返します.

    Database


    DBをチェックすると、次のように1つのテーブルにDTYPEがItem Typeで区切られていることがわかります.