サーチ…
パラメーター
| 注釈 | 詳細 |
|---|---|
@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をtimestampZonedDateTime
ベンダーに依存しない代替方法は、永続化が必要な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;
}