🏑

JPAのフィールドとカラムのマッピング

2022/01/29に公開

フィールドとカラムのマッピング

@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) @TableuniqueConstraintsとほぼ一緒 ----
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
  • 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;
}

(次)主キーマッピング

https://zenn.dev/dev_yoon/articles/a4710fef6e7494

Discussion