Spring Data JPA JpaRepository.save()不返回默认值

时间:2015-05-19 13:57:06

标签: java spring hibernate postgresql jpa

我有一个非常混乱的问题,偷了很多时间:

@Column(name = "created", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP", insertable = false, updatable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date created;

这段代码的时间戳是在我的Postgres DB中设置的,但是存储库返回一个创建了= null的实体;

我尝试过一些注释:

@Generated

来自: Spring Data JPA JpaRepository.save(entity) not returning database default values

但没有任何对我有用。

2 个答案:

答案 0 :(得分:5)

生成的值仅保证在刷新时生成。保存实体只会使其附加"到持久化上下文。所以,要么必须明确地刷新实体管理器。

尝试使用entity.saveAndFlush(),它应该有效。

答案 1 :(得分:1)

使用Spring Data我们遇到了与sql server相同的问题

我们使用

解决了这个问题
import org.hibernate.annotations.Generated;
import org.hibernate.annotations.GenerationTime;

@Generated(GenerationTime.INSERT)
@Column(name = "created", insertable = false, updatable = false)
private LocalDateTime created;

你可以把它结合起来saveAndFlush(来自JpaRepository)

如果没有任何效果,您可以通过扩展SimpleJpaRepository来实现刷新方法 或者避免使用数据库默认值并将其替换为EntityListener

@EnableJpaAuditing
public class ConfigClass {...}


@EntityListeners(AuditingEntityListener.class)
public class YourEntity {

    @Column(name = "created", insertable = false, updatable = false)
    @CreatedDate
    private LocalDateTime created;
}

请注意,使用EntityListener必须删除数据库默认值。您可以设置insertable = true并使用ColumnTransformer

    @Column(name = "created", updatable = false)
    @ColumnTransformer(write = "coalesce(sysutcdatetime(), ?)")
    @CreatedDate
    private LocalDateTime created;