【问题标题】:Spring Data JPA JpaRepository.save() does not return default valuesSpring Data JPA JpaRepository.save() 不返回默认值
【发布时间】:2015-07-31 09:47:45
【问题描述】:

我有一个非常令人困惑的问题,偷了很多时间:

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

此代码的时间戳是在我的 Postgres 数据库中设置的,但存储库返回一个 created = null; 的实体;

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

@生成

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

但对我没有任何帮助。

【问题讨论】:

  • 你试过@GeneratedValue 注解吗?

标签: java spring hibernate postgresql jpa


【解决方案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;

【讨论】:

  • @Generated(GenerationTime.INSERT) 为我解决了问题。甚至可以使用常规的save()。谢谢
【解决方案2】:

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

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

【讨论】:

  • 就我而言,我有一列modified_at,默认值为当前日期时间。唯一对我有用的是@UpdateTimestamp。我不需要打电话给.flush()@Generated@GeneratedValue 注释都不起作用,即使在使用 .flush() 之后,该字段仍然会在 .save() 之后返回为 null。
  • thx 我怀疑交易没有完全结束,因为我试图在我的实体上生成修改和创建日期。但是该值可能是在实体保存之后插入的。
  • 当我使用已经存在的 ID 保存对象时,它确实只返回了 @UpdateTimestamp 绑定字段,而不是 @CreationTimestamp 字段...(空值)
猜你喜欢
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2015-01-13
  • 2020-03-26
  • 1970-01-01
  • 2016-11-07
  • 2017-08-29
相关资源
最近更新 更多