web-dev-qa-db-ja.com

JPAエンティティID-longまたはLong

エンティティのIDはlong(primitive type)またはLong(オブジェクトタイプ)?

  • IDはテーブルの主キーであり、データベースで「null」になることはありません。
  • 私の同僚は、オブジェクトタイプLongの使用を提案しています。
  • Hibernate Reverse Engeneeringツールは、デフォルトでidのlongプリミティブ型を生成します。

何を選択しますか? longまたはLong?

@Entity
@Table(name = "COUNTRY")
public class CountryEntity implements Java.io.Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID")
    private long id;
    @Column(name = "NAME")
    private String name;
    @Column(name = "CURRENCY")
    private String currency;
    @Column(name = "PEOPLE")
    private Long people;
    @Column(name = "SIZE")
    private Long size;

    public CountryEntity() {
    }
28
Dimitri Dewaele

null値をチェックすることでエンティティが永続的なIDを持っているかどうかをチェックする方が正しいので(MySQLでは値0のIDを持つことができます)、Longの方が適切だと思います。また、Springのような一部のライブラリは、ロジックのLong(デフォルト)タイプのIDに基づいています。例については、この 実装 を参照してください。

プリミティブの小さな利点:スペースが少し少なくて済みます。

PS:どちらも正しく、JPA仕様に従ってサポートされており、この質問への回答は何らかの形で意見に基づいています。

23
Andrei I

データベースにIDを生成させる(そうする必要があります)場合、最近インスタンス化されたCountryEntityオブジェクトがid==null。 longを使用する場合、idは常にnull以外の値(最初は0)を持ち、エンティティの永続化時に変更されます。

4
wallenborn

たぶんこれで怒られますが、どちらでもありません。 JavaでIDフィールドを数値型として表すことはできません。それらに対して数学的な計算を実行する予定がない限り。代わりに文字列を使用してください。IDがLongの容量を超えたときにオーバーフローの問題が発生することはありません。 。また、24桁のLongをJSONにシリアル化してみると、問題が発生します。

1
i3ensays