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

Dan*_* R. 5 java postgresql spring hibernate jpa

我有一个很困惑的问题,那就是浪费很多时间:

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

这段代码的时间戳是在我的Postgres DB中设置的,但是存储库返回的实体具有created = null;

我尝试了一些注释,例如:

@生成

来自: Spring Data JPA JpaRepository.save(entity)不返回数据库默认值

但是对我没有任何作用。

Hen*_*nry 10

使用 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;
Run Code Online (Sandbox Code Playgroud)

您可以结合使用 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;
}
Run Code Online (Sandbox Code Playgroud)

考虑到使用 EntityListener 必须删除数据库默认值。您可以设置 insertable=true 并使用 ColumnTransformer

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

  • `@Generate(GenerationTime.INSERT)` 为我解决了这个问题。甚至可以与常规的“save()”一起使用。谢谢 (3认同)

tro*_*llr 5

生成的值仅保证在刷新时生成。保存实体只会使它“附加”到持久性上下文。因此,您必须显式地刷新实体管理器。

尝试使用entity.saveAndFlush(),它应该可以工作。