java 尝试应用 AttributeConverter 时出错

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/34171453/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 22:33:59  来源:igfitidea点击:

Error attempting to apply AttributeConverter

javaspringjpaspring-bootspring-data

提问by Appy

I was using JPA AttributeConverterwith spring boot 1.2.1 RELEASE and it worked fine. But I get the following error after upgrading to spring boot 1.3.0.RELEASE

我在AttributeConverterSpring Boot 1.2.1 RELEASE 中使用 JPA ,它运行良好。但是升级到 spring boot 1.3.0.RELEASE 后出现以下错误

    Caused by: javax.persistence.PersistenceException: Error attempting to apply AttributeConverter
    at org.hibernate.type.descriptor.converter.AttributeConverterSqlTypeDescriptorAdapter.bind(AttributeConverterSqlTypeDescriptorAdapter.java:103)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:286)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:281)
    at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:56)
    at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2843)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3248)
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3183)
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3525)
    at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:159)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:465)
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:351)
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1258)
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177)
    at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:77)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517)
    ... 81 more
Caused by: java.lang.NullPointerException
    at rafito.spring.boot.domain.TimestampPersistenceConverter.convertToDatabaseColumn(TimestampPersistenceConverter.java:16)
    at rafito.spring.boot.domain.TimestampPersistenceConverter.convertToDatabaseColumn(TimestampPersistenceConverter.java:10)
    at org.hibernate.type.descriptor.converter.AttributeConverterSqlTypeDescriptorAdapter.bind(AttributeConverterSqlTypeDescriptorAdapter.java:97)

I am not setting serviceBeginTime and serviceEndTime in my POST JSON currently. But this wasn't giving me a null pointer before I upgraded spring boot version.

我目前没有在我的 POST JSON 中设置 serviceBeginTime 和 serviceEndTime。但这并没有在我升级 Spring Boot 版本之前给我一个空指针。

Converter class

转换器类

@Converter
public class TimestampPersistenceConverter implements AttributeConverter<Long, Timestamp> {


    @Override
    public Timestamp convertToDatabaseColumn(Long aLong) {
        return new Timestamp(aLong);
    }

    @Override
    public Long convertToEntityAttribute(Timestamp timestamp) {
        return timestamp.getTime();
    }
}

Entity

实体

@Column(name = "service_begin_time")
@Convert(converter = TimestampPersistenceConverter.class)
Long serviceBeginTime;

@Column(name = "service_end_time")
@Convert(converter = TimestampPersistenceConverter.class)
Long serviceEndTime;

Database fields

数据库字段

service_begin_time timestamp without time zone,
service_end_time timestamp without time zone,

采纳答案by Appy

Added a null check as that was the easiest.

添加了空检查,因为这是最简单的。

@Override
    public Timestamp convertToDatabaseColumn(Long aLong) {
        if (aLong == null)
            return null;
        return new Timestamp(aLong);
    }