[JPA] DB Column, Class Field Mapping(@Column, @Enumerated, @Temporal, @Lob, @Transient, @Access)


🙆‍♂️ import 🙇‍♂️
Java ORM標準JPAプログラミング JPAから@Entityは、TableのクラスのField値をマッピングする.TableColumnマッピングのためのAnnotation.@Column@Enumerated@Temporal@Lob@Transientがあります.
以下、これらのAnnotationの説明です.
@Column@Accessは、オブジェクトフィールドをTable Columnにマッピングする.
@Columnの説明はこの記事で確認できます。
@Enumerated
Javaをマッピングするための@Columnタイプ.
使用する属性は以下のenumのみであり、valueとして指定された値は以下のように説明される.
値の説明EnumType.ORDINALは、列挙された順序値の数値をDB EnumTypeに保存します.STRINGはそのenumの名前をDBに保存します
デフォルト値はvalueです.EnumType.ORDINALの利点は、記憶容量が小さいことである.
ストレージのenum順序が変更されると、大きな混乱を引き起こす可能性があります.
ほぼEnumType.ORDINALに指定する必要があります.
使用例を次に示します.
@Table(name = "TB_LICENSE")
@Entity
public class License {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "L_ID")
    private long id;

    @Enumerated(value = EnumType.STRING)
    @Column(name = "type")
    private LicenseType type;

}
@Temporal
日付タイプ(EnumType.STRINGjava.util.Date)マッピングに使用します.
使用する属性はjava.util.Calendarであり、指定値については以下のように説明する.
値はTemporalTypeを示します.DATE日付、DB valueタイプおよびマッピング(2021-07-18)TemporalType.TIME時間、DB date型およびマッピング(19:23:15)複合型.TIMESTAMP日時、DB time型マッピング(2021-07-18 19:23:15)
使用例を次に示します.
@Getter
@MappedSuperclass
public class CommonEntity {
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "CREATED_DATE")
    private Date createdDate;
    
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "MODIFIED_DATE")
    private Date modifiedDate;
}
@Lob
DB timestampCLOBタイプのマッピングに使用します.BLOB Annotationには指定できる属性はありません.
マッピングField Typeは、@Lobに文字でマッピングされる.
残りの形態はCLOBにマッピングされた.
次に、BLOBCLOB、マッピングされたJava Field Typeを示します.
  • CLOB : BLOB , String , char[]
  • BLOB : java.sql.CLOB , byte[]
  • 次に、JavaでフィールドタイプでDBMSにマッピングされたColumnタイプの例を示します.
    @Lob
    private String clobField;
    
    @Lob
    private byte[] blobField;
    
    // DB Type
    // MySQL
    clobField longtext
    , blobField longblob
    
    // Oracle
    
    clobField clob
    , blobField blob
    
    // PostgreSQL
    clobField text
    , blobField old
    @Transientjava.sql.BLOBとして指定されたシーンはマッピングできません.
    データベースに保存したり、クエリーしたりしません.
    Javaオブジェクトに値を保持する場合にのみ使用します.
    @Transient
    private List<T> tempList;
    @Access@Transient Annotationは、@Accessにおいて、Entity ClassがこのJPAデータにアクセスする方法を指定する.
    方法はEntityAccessType.FIELDの2種類がある.
  • AccessType.FIELD:Fieldがprivateに設定されていても、Fieldに直接アクセスします.
  • AccessType.PROPERTY:訪問者(Getter)でアクセスします.
  • @Access(AccessType.FIELD)
    @Entity
    public class User {
        @Id
        private long id;
        
        private String name;
        
        public long getId() {
        	return id;
        }
        
        public String getName() {
        	return name;
        }
    }
    AccessType.PROPERTYが設定されていない場合、@Accessの位置設定方法に基づいている.
    @Id位置=Field@Id設置のように直接現場を訪問します.
    @Entity
    public class User {
        @Id
        private long id;
        
        private String name;
        
        public long getId() {
        	return id;
        }
        
        public String getName() {
        	return name;
        }
    }
    @Id位置=プロパティ@Acess(AccessType.FIELD)の設定のように、訪問者Getterでアクセスします.
    @Entity
    public class User {
        
        private long id;
        
        private String name;
        
        @Id
        public long getId() {
        	return id;
        }
        
        public String getName() {
        	return name;
        }
    }
    Field、Propertyメソッドの混在@Acess(AccessType.PROPERTY)をフィールドに配置し、基本データメソッドを@Idに設定します.Fieldで特定のレルムにアクセスすることで、特定のレルムのみがアクセス者Getterでアクセスできます.
    @Entity
    public class User {
        
        @Id
        private long id;
        
        @Transient
        private String name;
        
        private String loginId;
        
        public long getId() {
        	return id;
        }
        
        @Access(AccessType.PROPERTY)
        public String getLoginId() {
        	return name + "gillog";
        }
    }
    上記の使用例は、他の領域のAccessTypeが@Access(AccessType.PROPERTY)にあることを示している.FIELDアクセスで、@Idにはgetter@Access(AccessType.PROPERTY)万AccessTypeが設けられている.PROPERTYでアクセスします.loginIdnameには、データベースおよびストレージおよびクエリーはありません.
    @Transientの使用Field Columnは、loginIdフィールド値にnameを加えた値を格納する.