JodaTime有JPA,PostgreSQL和NULL值

Eel*_*lke 8 java postgresql jpa jodatime eclipselink

我试图将带有JPA的JodaTime DateTime字段保存到PostgreSQL,但是遇到了对数据库NULL值的空指针的麻烦.

我正在使用NetBeans 7 beta 2 IDE.持久性实现是EclipseLink 2.2.0,我使用EclipseLink Converter来使映射工作.这是我的领域的声明:

@Converter(
    name="dateTimeConverter",
    converterClass=ejb.util.DateTimeConverter.class
)
@Column(columnDefinition="TIMESTAMP WITH TIME ZONE")
@Convert("dateTimeConverter")
private DateTime testdate;
Run Code Online (Sandbox Code Playgroud)

转换器类:

public class DateTimeConverter implements Converter {

    private Logger log;
    private static final long serialVersionUID = 1L;

    @Override
    public Object convertObjectValueToDataValue(Object o, Session sn) {
        if (o == null) {
            log.info("convertObjectValueToDataValue returning null");
            return null;
        }
        return ((DateTime)o).toDate();
    }

    @Override
    public Object convertDataValueToObjectValue(Object o, Session sn) {
        if (o == null) {
            log.info("convertDataValueToObjectValue returning null");
            return null;
        }
        return new DateTime(o);
    }

    @Override
    public boolean isMutable() {
        return true;
    }

    @Override
    public void initialize(DatabaseMapping dm, Session sn) {
        log = Logger.getLogger("ejb.util.DateTimeConverter");
    }

}
Run Code Online (Sandbox Code Playgroud)

只要有实际的DateTime设置,这就可以正常工作.但是一旦没有设置,EclipseLink似乎就会假设一个字符串类型,并且postgresql开始抱怨类型字符的值变化.我假设这是因为转换器类返回空指针而不是日期对象,而EclipseLink则返回默认值.

有没有办法让这个工作没有切换到普通的java.util.Date?

Jam*_*mes 7

使用a时@Converter,EclipseLink不知道类型,因此您需要初始化它.

在您的initialize(DatabaseMapping dm, Session sn)方法中,您需要设置类型,

dm.setFieldClassification(java.sql.Date.class);
// or, dm.setFieldClassification(java.sql.Timestamp.class);
Run Code Online (Sandbox Code Playgroud)

  • 找到它,它是在子类AbstractDirectMapping上定义的.因此,在检查类型并将其投射后,它正在工作.谢谢. (2认同)