エンティティのマッピング
オブジェクトとテーブルのマッピング
エンティティは、データベース内のテーブルにマッピングされたJavaオブジェクトです.したがって,Javaでテーブル内のデータを制御するためには,エンティティをうまくマッピングしなければならない.
エンティティをテーブルにマッピングする基本構文を見てみましょう.
@Entity
JPAを使用して、テーブルにマッピングするJavaオブジェクトをエンティティと呼びます.エンティティ宣言を使用してテーブルにマッピングされることをこのエンティティに通知する必要があります.
name attributeを使用してエンティティの名前を指定できます.省略できます.省略する場合は、クラスの名前をエンティティの名前として使用します.
@Table
エンティティにマッピングするデータベース・テーブルを指定する方法です.省略できます.省略すると、エンティティ名と同じテーブルが検索され、自動的にマッピングされます.
name attributeにマッピングするテーブル名を指定する必要があります.
@Entity
@Table(name = "MEMBER")
public class Member {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
}
プライマリ・キーのマッピング
JPAでテーブルをクエリーする場合、通常はプライマリ・キー識別子を使用してクエリーを行います.したがって、データベースのプライマリ・キーをエンティティにマッピングする必要があります.
@Id
Id宣言をデフォルトキーとして使用するエンティティのフィールドに明記します.
プライマリ・キー生成ポリシー
データベースのプライマリ・キーはbigintタイプの整数として宣言され、通常auto increment制約があります.この場合、エンティティはどのようにしてプライマリ・キーを作成しますか?
ちょくせつわりあて
直接割り当ては、auto increment制約を使用しないデータベースです.この場合、エンティティはプライマリ・キー作成ポリシーを指定する必要はありません.データを挿入するときに、プライマリ・キーを同時に割り当てる必要があります.
IDENTITY
この方法は、プライマリ・キー生成をデータベースに委任する方法です.エンティティでは、プライマリ・キーに単独で触れなくても、データベースにプライマリ・キーが作成されます.
JPAでは、すべてのエンティティがプライマリ・キー識別子で区切られています.したがって、このようにデータを格納すると、javaでは識別子が分からないため、保存後、データベースと通信して識別子を取得する.つまり、書くのが遅くて役に立たないということです.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
SEQUENCE
Oracle、PostgreSQL、DB 2、H 2などのデータベースの作成に使用できるポリシーです.これらのデータベースはシーケンスをサポートし、シーケンスを使用してプライマリ・キーを生成します.
まず、次のようにシーケンスを生成する必要があります.
CREATE SEQUENCE TEST_SEQ START WITH 1 INCREMENT BY 1;
次に、エンティティに@SequenceGeneratorを指定し、データベースで生成されたシーケンスを最初にマッピングし、そのGeneratorをプライマリ・キーに再マッピングします.@Entity
@SequenceGenerator(name = "TEST_SEQ_GENERATOR", sequenceName = "TEST_SEQ",
initialValue = 1, allocationSize = 1)
public class Member(
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "TEST_SEQ_GENERATOR")
@Column(name = "id")
private Long id;
)
TABLE
この方法では、シーケンスがサポートされていないデータベースでテーブルをシーケンスとして使用します.まず、シーケンスとして使用するテーブルを次のように作成する必要があります.
CREATE TABLE TEST_SEQUENCES(
sequence_name varchar(255) not null,
next_val bigint,
primary key( sequence_name )
)
生成されたテーブルを@Table Generatorにマップし、このGeneratorをプライマリ・キーにマップします.@Entity
@TableGenerator(name = "TEST_SEQ_GENERATOR", table = "TEST_SEQUENCES",
pkColumnValue = "TEST_SEQ", allocationSize = 1)
public class Member(
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "TEST_SEQ_GENERATOR")
@Column(name = "id")
private Long id;
)
TEST SEQUENCEテーブルでは、TEST SEQの値がsequence name(PK)と入力され、シーケンス値がnext valで1インクリメンタルでジェネレータが作成されマッピングされます.AUTO
上記の基本鍵生成ポリシーがあるが、JPAはAUTOポリシーをベースとして提供している.これは、データベースの方言によって異なるポリシーが提供され、OracleではSEQUENCE、MySQLではIDENTITYが選択されます.
@Id @GeneratedValue
private Long id;
通常、AUTO戦略は実務で上のように使用されます.データベースが変わっても、方言は自動的に戦略を選択するからです.フィールドとカラムのマッピング
エンティティとテーブルをマッピングした後、エンティティのフィールドとテーブルの列をマッピングする必要があります.マッピングの説明を下表に示します.
マッピング宣言@Column列からマッピング@Enumeration Javaへの列挙タイプマッピング@Temporal日付タイプマッピング@LobBLOB/CLOBタイプマッピング@Transent非マッピング@Accessメソッドの指定
この表の内容を一つ一つ指摘しましょう.
@Column
これは柱をマッピングするツールです.DDLを使用しない場合、デフォルトで使用される属性はname属性のみです.マッピングするカラム名のプロパティを指定します.
ただしnullableプロパティは例外です.nullableプロパティのデフォルトはtrueで、falseに設定するとnot null制約が追加されます.
ただし、フィールドのタイプによってはnullableを指定する必要がある場合があります.intタイプのフィールドを使用する場合、javaのデフォルトタイプであるため、空の値は使用できません.したがって、@Column(name="id"、nullable=false)などのnot null制約を追加する必要があります.
そうでなければ、最初はintタイプの代わりにIntegerタイプを使う方法もあります.
@Enumerated
Enumeration宣言はjavaのenumタイプをマッピングする宣言です.value属性があり、EnumTypeがあります.ORDINAL, EnumType.STRINGを選択して入力できます.
前者はenumオブジェクトの順序でデータベースに格納され、後者はコンテンツでデータベースに格納されます.
@Temporal
一時的な宣言は、日付タイプをマッピングするために使用されます.DATE、TIME、TIMESTAMPの値を入力できるvalueプロパティがあります.
DATEマッピング日、TIMEマッピング時間、TIMESTAMPマッピング日および時間.フィールドのタイプはDateタイプを使用できます.
@Lob
データベースのマッピングに使用されるBLOB、CLOBタイプ.
CLOBは文字型データを格納するタイプであり、バイナリデータを格納するタイプはBLOBである.
@Transient
このフィールドをマップしないときに使用する構文.エンティティのフィールドを一時的に記憶領域として使用します.
@Access
JPAがエンティティにアクセスする方法を指定します.
@Entity
@Access(AccessType.FIELD) / @Access(AccessType.PROPERTY)
上記の2つの方法で使用します.前者はフィールドに直接アクセスする方法であり、後者はgetterを使用してフィールドにアクセスする方法である.Id宣言はフィールドにフィールド形式で設定し、getterに属性形式で設定するので省略できます.
また、フィールドにアクセス宣言を指定して、そのフィールドのみに対してアクセスメソッドを例外化することもできます.
Reference
この問題について(エンティティのマッピング), 我々は、より多くの情報をここで見つけました https://velog.io/@jaeseok-go/엔티티-매핑テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol