代码之家  ›  专栏  ›  技术社区  ›  iftekhar iftekhar

当前时间戳未使用jpa自动保存到表中

  •  0
  • iftekhar iftekhar  · 技术社区  · 7 年前

    我正在使用下面的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;
    }
    

    当我插入数据时,如日期数据=新数据(“12312442”);

    LogsRepository.save(data);
    

    “created\u at”值在DB中保存为空值。谁能告诉我我做错了什么?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Cepr0    7 年前

    对于在DB层上填充值的字段,可以使用Hibernate注释 @Generated 这告诉冬眠者 阅读 此类值 之后 持久化实体。在您的情况下:

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

    注意,然后调用 logsRepository.save(data) Hibernate向DB创建两个查询:第一个-插入新数据:

    insert into data values(...)
    

    第二-读取生成的值:

    select created_at from data where id = ...
    
        2
  •  0
  •   crizzis    7 年前

    您可以尝试使用 @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);
        }
    
    }