我有一个非常混乱的问题,偷了很多时间:
@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
但没有任何对我有用。
答案 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;