JPA2を使用してユーザータイプのフィールドを含むエンティティを永続化する方法

StackOverflow https://stackoverflow.com/questions/2492160

  •  21-09-2019
  •  | 
  •  

質問

ユーザータイプのフィールドを含むエンティティを永続化する方法を探しています。この特定の例では、 ts フィールドをミリ秒単位で指定します。

import org.joda.time.DateTime;

@Entity
public class Foo {

  @Id
  private Long id;

  private DateTime ts;
}
役に立ちましたか?

解決

JPA にはカスタム プロパティ タイプを登録する機能がないため、プロバイダー固有のものを使用する必要があります。

他のヒント

それはありませんので、 JPAを使用すると、実装の詳細に依存しているサポートされているタイプを定義しました。 DataNucleusのは、ご希望の永続化を可能にするJodaTime用のプラグインを持っています。

のいずれかを使用すると、これらのプロバイダーの特定の低いものを使用するかは、代理@PostPersistフィールドと@PostUpdate@PostLoad@Transientのコールバックメソッドを利用することができます。

http://www.java2s.com/Tutorial/Java/0355__JPA/ EntityListenerPostLoad.htm にあなたにいくつかのアイデアを与えるだろう。

任意のさらなる明確化のために連絡を取るために快適に感じるしてください。

一つの解決策は、非列のプロパティを使用して、ゲッター/セッターとそれらをカプセル化することです。

代わりに、直接プライベートフィールドをaccesingの、あなたが代わりのプライベートロングID ののの公共ロングのgetId()の上@Id注釈を付ける必要があります使用ゲッター/セッターにJPAに伝えるために

。これを実行すると、単にカラムに直接対応していないすべてのゲッターのために@Transientを使用することを覚えています。

次の例では、アプリケーションが日時getTs(持っているだろうが、のMyDateに該当のという名前の日付列を作成)し、そのために利用可能な敷石()メソッドです。 (いないことを確認するDateTime APIについては、軽微な誤差はご容赦ください。))

import org.joda.time.DateTime;

@Entity
public class Foo {

  private Long id;

  private DateTime ts;

  @Id
  public Long getId() { return id; }

  public void setId(Long id) { this.id = id; }



  // These should be accessed only by JPA, not by your application;
  // hence they are marked as protected

  protected Date getMyDate() { return ts == null ? null : ts.toDate(); }

  protected void setMyDate(Date myDate) {
    ts = myDate == null ? null : new DateTime(myDate);
  }



  // These are to be used by your application, but not by JPA;
  // hence the getter is transient (if it's not, JPA will
  // try to create a column for it)

  @Transient
  public DateTime getTs() { return ts; }

  public void setTs(DateTime ts) { this.ts = ts; }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top