我正在寻找一种方法来持久化包含用户类型字段的实体。 在这个特定的例子中,我想将 ts 字段保持为毫秒数。
import org.joda.time.DateTime;
@Entity
public class Foo {
@Id
private Long id;
private DateTime ts;
}
答案 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; }
}