楽落人の備忘録

楽して生きていきたい。知識とか覚えておきたくない。

@Columnアノテーション

@ColumnアノテーションとはDBとJPAの定義をマッピングするときに利用したりする。

試験的に以下のサイトを参考にDBアクセスをSpringbootとSpring data JPA(多分)を利用して作成していた時に既存環境との差異が発生したため、@Columnアノテーションンを利用した。

 

DBアクセス参考サイト:

https://intellectual-curiosity.tokyo/2019/04/21/spring-boot%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

 

既存環境との差異で発生したエラーは、

 Schema-validation: wrong column type encountered in column

というもので、DB上はCHARのカラムをSTRINGで受け取るようにエンティティクラスを定義していたところ、エラーが発生した。

どうもSTRING定義はデフォルトの場合はDB上はVARCHARとして扱うようで、CHARは対応していないとしてエラーが発生した模様。

上記サイトのサンプルソースではエンティティに@Columnを付与していなかったが、エラー回避のためにエラーの起きていたカラム定義箇所に@Column(name="DB上のカラム名",columnDefinition="CHAR")と定義したところエラーは発生しなくなった。

 

 

上記から@Columnは@Idのように必須ではないが、ない場合はデフォルト挙動として一定の動作をするようになっているが、それが今回は想定外の状態だったと思われる。

@Columnすべてのカラムに書いておいたほうがいいような気がするが、書きすぎるとメンテが手間になりそう。

 

ちなみにそもそも@Columnとは

@Columnアノテーション
このメンバ変数は、テーブルのこの列に対応していますよ、という意味(name=で実際の列名を指定する)。nullable=falseをつけると NOT NULLの意味になる。VARCHAR(20)のような長さの指定は length=で付ける。対象DBのネイティブなSQL表現でカラム定義を指定したい場合は columnDedinitionを使用する。
例)@Column(name="START_DATE", columnDefinition="DATE DEFAULT CURRENT_DATE")

とのこと。

参考:

データベースのテーブルを Javaで作る - ブログ - ワルブリックス株式会社

 

エンティティ自動生成方法は以下が参考になりそう。

Wiki: JPAによるエンティティクラスの自動生成