如何使用JPA2持久保存包含用户类型字段的实体

时间:2010-03-22 12:29:24

标签: java jpa jpa-2.0

我正在寻找一种方法来持久化包含用户类型字段的实体。 在这个特定的例子中,我想将 ts 字段保持为毫秒数。

import org.joda.time.DateTime;

@Entity
public class Foo {

  @Id
  private Long id;

  private DateTime ts;
}

4 个答案:

答案 0 :(得分:6)

JPA无法注册自定义属性类型,您必须使用提供程序特定的东西:

答案 1 :(得分:1)

由于它不是JPA定义的受支持类型,因此您依赖于实现细节。 DataNucleus有一个JodaTime插件,可以让你获得所需的持久性。

答案 2 :(得分:1)

您可以使用这些提供商特定的内容,也可以使用代理@PostPersist字段的@PostUpdate@PostLoad@Transient回调方法。

http://www.java2s.com/Tutorial/Java/0355__JPA/EntityListenerPostLoad.htm会给你一些想法。

如果需要进一步说明,请放心。

答案 3 :(得分:1)

一种解决方案是使用非列属性并使用getter / setter封装它们。

要告诉JPA使用getter / setter而不是直接访问私有字段,您必须在 public Long getId()而不是 private Long id 上注释@Id。这样做时,请记住对每个直接与列对应的getter使用@Transient。

以下示例将创建名为 myDate 的Date列,而应用程序将具有可用的DateTime getTs()和setTs()方法。 (不确定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; }
}