サーチ…
パラメーター
注釈 | 詳細 |
---|---|
@Id | エンティティのキーとしてフィールド/列をマークします。 |
@Basic | 要求されたフィールドを基本タイプとしてマップすることをマークします。これはプリミティブ型とそのラッパー、 String 、 Date 、 Calendar 適用されCalendar 。パラメタが与えられていない場合、実際には注釈はオプションですが、意図を明確にするためにはスタイルが良いでしょう。 |
@Transient | 一時的なものとしてマークされたフィールドは、直列化のtransient キーワードと同様に、永続性のために考慮されません。 |
備考
常にデフォルトのコンストラクタ、つまりパラメータのないコンストラクタが必要です。基本的な例では、コンストラクタが指定されていなかったので、Javaは1を追加しました。引数を持つコンストラクタを追加する場合は、パラメータのないコンストラクタも必ず追加してください。
非常に簡単なエンティティ
@Entity
class Note {
@Id
Integer id;
@Basic
String note;
@Basic
int count;
}
Getters、setterなどは簡潔に省略されていますが、JPAには必要ありません。
このJavaクラスは、次の表にマッピングされます(データベースに応じて、Postgresマッピングの可能性があります)。
CREATE TABLE Note (
id integer NOT NULL,
note text,
count integer NOT NULL
)
JPAプロバイダを使用してDDLを生成し、ここに示すDDLとは異なるDDLを生成する可能性がありますが、互換性がある限り実行時に問題は発生しません。 DDLの自動生成に頼らないことが最善です。
マッピングからのフィールドの省略
@Entity
class Note {
@Id
Integer id;
@Basic
String note;
@Transient
String parsedNote;
String readParsedNote() {
if (parsedNote == null) { /* initialize from note */ }
return parsedNote;
}
}
クラスにデータベースに書き込まれてはならないフィールドが必要な場合は、 @Transient
としてマークします。データベースからの読み取り後、フィールドはnull
になりnull
。
マッピングの時間と日付
Javaでは、 Date
とCalendar
、そして最近のLocalDate
とLocalDateTime
歴史的なDate
とCalendar
があります。 Timestamp
、 Instant
、 ZonedLocalDateTime
、 ZonedLocalDateTime
-timeの各タイプがあります。データベース側では、 time
、 date
、 timestamp
(時刻と日付の両方)を持ちdate
、 timestamp
ゾーンの有無にかかわらず可能性があります。
Java 8より前の日付と時刻
プリJava-8タイプのjava.util.Date
、 java.util.Calendar
、およびjava.sql.Timestamp
のデフォルトマッピングはSQLのtimestamp
です。 java.sql.Date
場合はdate
です。
@Entity
class Times {
@Id
private Integer id;
@Basic
private Timestamp timestamp;
@Basic
private java.sql.Date sqldate;
@Basic
private java.util.Date utildate;
@Basic
private Calendar calendar;
}
これは、次の表に完全に対応します。
CREATE TABLE times (
id integer not null,
timestamp timestamp,
sqldate date,
utildate timestamp,
calendar timestamp
)
これは意図ではないかもしれません。たとえば、JavaのDate
またはCalendar
は、日付のみを表すために(生年月日のために)使用されることがよくあります。デフォルトのマッピングを変更するには、またはマッピングを明示的にするために@Temporal
アノテーションを使用します。
@Entity
class Times {
@Id
private Integer id;
@Temporal(TemporalType.TIME)
private Date date;
@Temporal(TemporalType.DATE)
private Calendar calendar;
}
同等のSQLテーブルは次のとおりです。
CREATE TABLE times (
id integer not null,
date time,
calendar date
)
注1: @Temporal
指定された型はDDL生成に影響します。 @Basic
注釈だけでDate
型のdate
型の列を持つこともできます。
注2: Calendar
はtime
だけ持続することはできません。
Java 8の日付と時刻
JPA 2.1では、Java 8で提供されているjava.time
型のサポートは定義されていません java.time
2.1実装の大部分は、厳密にはベンダー拡張ではありますが、これらのタイプのサポートを提供しています。
DataNucleusの場合、これらのタイプは@Temporal
で動作し、 @Temporal
アノテーションを使用してさまざまなマッピングの可能性を提供します。
Hibernateの場合、Hibernate 5.2+を使用している場合、 @Basic
アノテーションを使用するだけですぐに@Basic
ます。 Hibernate 5.0-5.1を使用している場合は、依存関係org.hibernate:hibernate-java8
を追加する必要があります。提供されるマッピングは
-
LocalDate
にdate
-
Instant
、LocalDateTime
、ZonedDateTime
をtimestamp
ZonedDateTime
ベンダーに依存しない代替方法は、永続化が必要なJava 8のjava.time
型のJPA 2.1 AttributeConverter
を定義することです。
シーケンス管理されたIDを持つエンティティ
ここではクラスがあり、IDフィールド( userUid
)にデータベース内のSEQUENCEを介して値が生成されるようにします。このSEQUENCEはUSER_UID_SEQ
とUSER_UID_SEQ
れ、DBAによって作成されるか、JPAプロバイダによって作成されます。
@Entity
@Table(name="USER")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name="USER_UID_GENERATOR", sequenceName="USER_UID_SEQ")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="USER_UID_GENERATOR")
private Long userUid;
@Basic
private String userName;
}