🏑
JPAのフィールドとカラムのマッピング
フィールドとカラムのマッピング
@Column
- Javaのフィールドとデータベースのカラムをマッピングしてくれるアノテーション
@Entity
public class Member {
// DBのNAMEカラムとマッピングする。
@Column(name = "NAME")
private String userName;
}
-
@Columnを付けない場合フィールド名そのままマッピングされる。
@Entity
public class Member {
// DBのuserNameカラムとマッピングされる
// Springと一緒に使用するとuser_nameカラムとマッピングされる。
private String userName;
}
| 属性 | 説明 | ディフォルト値 |
|---|---|---|
| name | フィールドとマッピングするカラムの名前 | フィールド名 |
| insertable, updatable | 登録、変更可能かどうか | TRUE |
| nullable(DDL) | nullを許すかどうか、falseに設定する場合DDL自動生成時にnot null制約が追加される | ---- |
| unique(DDL) |
@TableのuniqueConstraintsとほぼ一緒 |
---- |
| columnDefinition(DDL) | DBのカラム情報を直接付与できる | ---- |
| length(DDL) | 文字の長さの制約を追加,Stringにだけ有効 | 255 |
| precision,scale(DDL) | BigDecimal,BigIntegerの長さ指定可能 | precision = 19, scale = 2 |
-
name: 指定した名前をDBのカラムとマッピングする。- DDL自動生成機能を使う場合
name="指定した名前"指定した名前でDBにカラムが生成されそのカラムとマッピングする。 - spring bootと一緒に使うとキャメルケースが小文字アンダースコア方式に自動的に変わる。
- camelCase → under_score 例)java field :
userName-> DB column :user_name)
- DDL自動生成機能を使う場合
-
uniqueは@Tableにて指定する事をお勧めする、その理由はUnique keyの名前を指定することが出来ないからです -
columnDefinition: DDLをそのまま埋め込む事ができる.
@Column(columnDefinition = "varchar(50) default 'EMPTY'")
-
precision,scale(DDL): precisionは小数点を含む全体桁数、scaleは小数点以下の桁数
@Enumerated
- Javaのenumタイプとマッピングするときに使用する。
@Entity
public class Customer {
// CustomerStatus PLATINUM, VIP, BASIC,
@Enumerated(EnumType.STRING)
private CustomerStatus status;
}
enumタイプを使うときは必ず
EnumType.STRINGを使用する事をお勧めする。
| 属性 | 説明 | ディフォルト値 |
|---|---|---|
value |
EnumType.ORDINAL: enumタイプの順番をDBに保存、0,1,2.. EnumType.STRING : enumタイプの名前をDBに保存, SAVE,CANCEL.. |
EnumType.ORDINAL |
@Temporal
- Dateタイプをマッピングするときに使用する(java.util.Date, java.util.Calendar)
@Entity
public class Order {
@Temporal
private Date date;
}
- Java8以後の
LocalDate,LocalDateTimeには使用しない.(最新Hibernateの支援)- 今の時代を考えると
LocalDateを使用するのが当たり前
- 今の時代を考えると
| 属性 | 説明 | ディフォルト値 |
|---|---|---|
value |
TemporalType.DATE: DBのdateタイプとマッピングする。 TemporalType.TIME : DBのtimeタイプとマッピング |
---- |
@Lob(Large Object)
- データベースのBLOBタイプとマッピング
- マッピングするフィールドタイプが文字ならCLOBマッピング、他はBLOBマッピング。
-
CLOB: <-String,char[], java.sql.CLOB -
logtext(MySQL) : <-String -
BLOB: <-byte[], java.sql. BLOB*
// MySQLの場合longtextにマッピングされる。
@Lob
private String description;
参考 :
Lobとは? データベースに保存される多様なタイプのデータの中で構造化されてないテータを扱うためのタイプ。
@Transient
- データベースに保存または照会しないフィールドに使用。(マッピングしたくないフィールドに使用)
- 主にメモリ上で仮にある値を保存したい時に使用する
@Entity
public class Order {
@Transient
private Long temp;
}
(次)主キーマッピング
Discussion