Java Persistence / JPA:@Column vs @Basic


119

違いは何である@Column@BasicJPAでのアノテーションは?一緒に使用できますか?それらを一緒に使用する必要がありますか?または、それらの1つで十分ですか?

回答:


147
  • @Basic属性が永続化され、標準のマッピングが使用されることを示します。これには、属性を遅延ロードするかどうか、およびnull値を許可するかどうかを指定できるパラメーターがあります。

  • @Column 属性を永続化するデータベース内の列の名前を指定できます。

どちらか一方を指定しないと、デフォルトの動作が得られるため、特別な場合を除いて、通常は1つだけを使用します。

したがって、属性の遅延読み込みを行い、列名を指定したい場合は、

 @Basic(fetch=FetchType.LAZY)
 @Column(name="WIBBLE")

デフォルトの遅延のない動作@Columnが必要な場合は、それで十分です。


2
これは明確な答えです。ありがとうございました。したがって、@Basicなし@Columnで使用できると想定しています。そのため、optionalおよびnullableプロパティが両方に存在します。私は正しいですか?
Hosam Aly

1
@Basicのnullableと@Columnのnullableの違いと、どちらか一方、または両方を指定した場合の影響について、JPA仕様を完全に理解しているわけではありません。@Basic nullableは、スキーマ生成に関連する「ヒント」として記述されます。@Column nullableは、データベースの列の特性を定義するものとして説明されています。私の実践では、@ Columnケースを使用します。
djna 2009

16
@Basic(オプション)は、DBに保存する前に、永続プロバイダーによって実行時にチェックされます(チェックする必要があります)。@Columnは、データベース内の列の定義であり、スキーマの生成に使用される:stackoverflow.com/questions/2899073/...
ピョートルGwiazda

2
その「怠惰ではない」、EAGERを呼び出します。LOL
ソルベーター2014

7
JPAアノテーションは、純粋なリレーショナルアノテーションと実装アノテーションの2つのグループに分類できます。純粋なリレーショナルアノテーションには、Entity、Basic、OneToOne、OneToMany、ManyToMany、...が含まれますが、実装アノテーションは、純粋な理論モデルを実際のデータベースにマップする方法についての手がかりを提供します:テーブル、列、... 'は、リレーショナルエンティティ属性に関する情報を提供するための注釈であり、' Column 'は、それをデータベース列にマップする方法に関する情報を提供します。
Bruno Ranschaert、2015年

50

加えて、@ djnaの答え、それはそれは注目に値する@Basicと比較しなければならない@OneToMany@ManyToOne@ManyToMany。これらの1つだけを任意のプロパティで指定できます。

@Column そして @JoinColumnデータベース列のプロパティを記述するために、これらのいずれかと一緒に指定することができます。

これらは一緒に使用できる2つのアノテーションセットですが、一度に使用できるのは各セットの1つのアノテーションのみです。


21

Basicはプリミティブフィールド用に設計されていることは注目に値します

http://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes

基本属性とは、属性クラスが文字列、数値、日付、プリミティブなどの単純な型である属性です。基本属性の値は、データベースの列値に直接マップできます。

サポートされるタイプと変換は、JPA実装とデータベースプラットフォームによって異なります。データベースタイプに直接マップしないタイプを使用する基本的な属性は、バイナリデータベースタイプにシリアル化できます。

JPAで基本的な属性をマップする最も簡単な方法は、何もしないことです。他の注釈がなく、他のエンティティを参照しない属性は、自動的に基本としてマップされ、基本タイプではない場合でもシリアル化されます。属性の列名はデフォルトで、属性名と同じ名前が大文字で付けられます。


良いメモ。ありがとうございました。
Hosam Aly 2013年

1
いいえ、列アノテーションが指定されていない場合、デフォルト値が適用されます(名前は属性1になります)。
Gab

2

@BasicアノテーションはJPAエンティティに適用され、@ Columnはデータベース列に適用されます。@ Basicアノテーションのオプション属性は、エンティティフィールドをnullにできるかどうかを定義します。一方、

  • @Columnアノテーションのnullable属性は、対応するデータベース列をnullにできるかどうかを指定します
  • @Basicを使用して、フィールドを遅延ロードする必要があることを示すことができます
  • @Columnアノテーションを使用すると、マップされたデータベース列の名前を指定できます
  • @Basicアノテーションは、プロパティをJavaオブジェクトレベルでオプションではないとしてマークします。列マッピングで(nullable = false)は、NOT NULLデータベース制約の生成のみを担当します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.