4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Entityクラスの@Idアノテーションでハマった話

Last updated at Posted at 2021-11-04

Springbootでアプリケーションを作る際に、Entityクラスの主キーに@Idをつける場合があります。
本日はこの@Idアノテーションでハマった話を書いていこうと思います。

#@Idアノテーション
@idアノテーションは、以下のように説明されています。

javax.persistence.Id
Specifies the primary key of an entity. The field or property to which the Id annotation is applied should be one of the following types: any Java primitive type; any primitive wrapper type; String; java.util.Date; java.sql.Date; java.math.BigDecimal; java.math.BigInteger.
The mapped column for the primary key of the entity is assumed to be the primary key of the primary table. If no Column annotation is specified, the primary key column name is assumed to be the name of the primary key property or field.

エンティティの主キーを指定します。そのフィールドとプロパティは次の型を使うべきです。
Javaのプリミティブ型、プリミティブラッパータイプ、String、Date、math、bigDecimal,BigInteger
エンティティの主キーのマップされた列は、主テーブルの主キーであると見なされます。 列の注釈が指定されていない場合、主キーの列名は主キーのプロパティまたはフィールドの名前であると見なされます。

つまり主キーであると明示するアノテーションであるということはわかります。

Emtity.java
@Id
@Column(name = "user_id")
private int userId;

user_idのカラムに対応付いており、userIdのフィールドは主キーであることを示しています。
ここで問題が起きました。

RestAPIでsaveを行った際に、主キーとなるデータをnullの状態でsendするのですが、nullではなく、0がRequestされてしまいます。
スクリーンショット 2021-11-05 0.24.00.png

これだと最初の0の状態の1回のみはsaveが成功しますが、その後のsaveが転けてしまいます。
これの問題解決方法は、Long型にすることです。
image.png
Exampleにint型を使用していたので使ってみたら無事nullをRequestすることに成功しました。

image.png

ただしこれだけでは足りません。Postgresqlを使っていますが、シーケンスを貼ることができないのでどちらにしろ実行は失敗してしまいます。
そこで次を追記します。
@GeneratedValue(strategy = GenerationType.IDENTIFY)

Emtity.java
@Id
@Column(name = "user_id")
@GeneratedValue(strategy = GenerationType.IDENTIFY)
private int userId;

これを追加すると、identify列を使用して,主キー(primaryキー)を生成してくれるので、
番号が重複してエラーになることもありません。identify列に関しては次の記事を参照
https://www.magicsoftware.co.jp/files/magic_help/Magicxpa2/Data_Management/SQL_Considerations/Identity_Column.htm

シーケンスについてはまだまだ勉強が必要そうですね。

4
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?