如何在使用JPA进行持久化或实例化时转换属性?

时间:2014-08-25 13:05:53

标签: java database jpa

我想知道JPA是否提供任何机制来持久保存具有Date字段的实体?

例如

@Entity
public class Trade {
    @Id
    @GeneratedValue
    private long id;

    // some jpa magic here maybe?
    private Date date;
    ...
}

当持久化此实体数据库时,只保留long作为字段...但是当实例化该实体时,它会将long转换为Date。

当所有数据库内容都是手动编码时,如果需要,可以轻松执行此操作。我试图在直接访问数据库时获得灵活性,但我想使用JPA来做到这一点。到目前为止,这是我唯一不知道如何正确行事的方式。


更新

日期类型只是一个例子,我的意思是一些自定义类型,我知道从原始实例转换为自定义实例的逻辑......

2 个答案:

答案 0 :(得分:4)

如果要将java.util.Date存储为long,则需要使用转换器(因为JPA 2.1)。 e.g:

import javax.persistence.AttributeConverter;

public class MyConverter implements AttributeConverter<Date, Long> {

    public Long convertToDatabaseColumn(Date attribute) {
        return attribute.getTime();
    }

    public Date convertToEntityAttribute(Long dbData) {
        return new Date(dbData);
    }

}

该字段的注释:

@Convert(converter = MyConverter.class)
private Date date;

Example Converter - Java Persistence/Basic Attributes - Wikibooks中查看更多内容(来自强烈推荐的书籍Java Persistence - Wikibooks

答案 1 :(得分:1)

您可以使用时态注释

@Temporal(DATE)
protected java.util.Date date;