【问题标题】:Current timeStamp is not getting automatically saved into the table with jpa当前时间戳未使用 jpa 自动保存到表中
【发布时间】:2018-09-20 04:17:20
【问题描述】:

我正在使用下面的 sql 查询在 postgres DB 中创建一个表。

CREATE TABLE IF NOT EXISTS data
(
    id serial, 
    created_at timestamp(0) without time zone DEFAULT (now())::timestamp(0) without time zone,
    created_by integer NOT NULL
);

实体类:-

@Entity
@Table(name = "data")
@Getter
@Setter
public class Data implements Serializable {
    private static final long serialVersionUID = 7462797749946000617L;

    public Data() {
    }

    public Data(Integer createdBy) {
        super();
        this.setCreatedBy(createdBy);
    }

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "created_at")
    private Timestamp createdAt;

    @Column(name = "created_by")
    private Integer createdBy;
}

当我插入数据时,例如 Date data=new Data("12312442");

LogsRepository.save(data);

“created_at”值在 DB 中被保存为空值。谁能告诉我我做错了什么?

【问题讨论】:

  • 很可能你的混淆层(又名“ORM”)正在显式发送NULL
  • 是的,就是这样..那么我该如何避免呢?

标签: java postgresql spring-boot jpa


【解决方案1】:

对于在 DB 层上填充值的字段,您可以使用 Hibernate 注释 @Generated,它告诉 Hibernate 读取这些值持久化实体之后。在你的情况下:

@Column(name = "created_at")
@Generated(GenerationTime.INSERT)
private Timestamp createdAt;

注意然后调用logsRepository.save(data) Hibernate 会创建两个对 DB 的查询:首先 - 插入新数据:

insert into data values(...)

second - 读取生成的值:

select created_at from data where id = ...

【讨论】:

    【解决方案2】:

    您可以尝试使用@Column(insertable = false),强制JPA 在生成INSERT 语句时忽略该列,以便应用默认的db 值。

    但是,假设您使用的是 spring 数据,为什么不简单地 @EnableJpaAuditing 然后用 @CreatedDate 注释属性?

    请注意,您可以用类似的方式处理createdBy,方法是使用@CreatedBy 对其进行注释并提供AuditorAware

    AuditorAware 与 Spring Security 完美集成。这是一个示例实现:

    @Component
    public class SpringSecurityAuditorAware implements AuditorAware<String> {
    
        @Override
        public Optional<String> getCurrentAuditor() {
            return Optional
                        .ofNullable(SecurityContextHolder.getContext().getAuthentication())
                    .filter(auth -> !(auth instanceof AnonymousAuthenticationToken))
                    .map(Authentication::getPrincipal)
                    .map(UserDetails.class::cast)
                    .map(UserDetails::getUsername);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多