首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用hibernate @CreationTimestamp注释存储毫秒值

基础概念

@CreationTimestamp 是 Hibernate 提供的一个注解,用于自动设置实体类的某个字段为记录创建时的时间戳。这个注解通常用于实体类的日期或时间字段上,以便在插入记录时自动填充当前时间。

相关优势

  1. 自动化:无需手动设置时间戳,减少代码冗余。
  2. 一致性:确保所有记录的时间戳都是准确且一致的。
  3. 可维护性:简化代码逻辑,便于后期维护和修改。

类型

@CreationTimestamp 注解通常用于 java.util.Datejava.time.LocalDateTime 类型的字段上。

应用场景

在需要记录数据创建时间的场景中非常有用,例如:

  • 日志记录
  • 订单管理
  • 用户活动跟踪

示例代码

假设我们有一个 User 实体类,其中包含一个 createdAt 字段,用于存储用户创建时间:

代码语言:txt
复制
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    @CreationTimestamp
    private LocalDateTime createdAt;

    // Getters and Setters
}

遇到的问题及解决方法

问题:为什么 @CreationTimestamp 注解没有存储毫秒值?

原因

@CreationTimestamp 注解默认使用的是 java.time.LocalDateTime 类型,而 LocalDateTime 不包含毫秒信息。

解决方法

  1. 使用 java.time.Instant 类型
代码语言:txt
复制
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.time.Instant;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    @CreationTimestamp
    private Instant createdAt;

    // Getters and Setters
}

Instant 类型包含毫秒信息,因此可以存储毫秒值。

  1. 自定义类型转换器

如果你仍然想使用 LocalDateTime,可以通过自定义类型转换器来存储毫秒值:

代码语言:txt
复制
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    @CreationTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdAt;

    // Getters and Setters

    @PrePersist
    protected void onCreate() {
        createdAt = Date.from(LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant());
    }
}

在这个例子中,我们使用 @Temporal(TemporalType.TIMESTAMP) 注解来指定日期时间类型,并在 @PrePersist 方法中将 LocalDateTime 转换为 Date 类型,以便存储毫秒值。

参考链接

希望这些信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何使用 JPA 和 Hibernate 将 Java Enum 映射到自定义值

如何使用 JPA 和 Hibernate 将 Java Enum 映射到自定义值 1、引言 在本文中,我们将探讨如何在使用 JPA 和 Hibernate 时,将 Java Enum 映射到自定义值。...虽然 Hibernate 提供了几种保存 Enum 值的选项,但能够自定义这个机制会更好,因为它可以让你更好地处理遗留应用程序或需要重新排序 Java Enum 值的用例。...3、如何使用 JPA 和 Hibernate 将 Java Enum 映射到自定义值 默认情况下,Hibernate 使用 EnumType 来确定是使用 Enum 名称还是序数来持久化 Enum 到底层数据库列中...5、总结 如果你想在持久化和获取给定的 Enum 值时使用自定义序数值,JPA 允许你使用自定义 AttributeConverter 并提供自己的映射逻辑。...例如,如果你的应用程序之前使用的是持久化到数据库中的默认序数值,重新排序 Enum 值会破坏应用程序,除非更新 post 表中的现有 Enum 列值或使用自定义 AttributeConverter 实例

7010
  • Java中使用Hibernate系列之加载并存储对象学习(第三节)

    经过第一、二节的学习,现在可以使用Hibernate来加载和存储对象了,先编写一个带有main()方法的EventManager类: 网络配图 代码如下: package events; import...,现在Hibernate负责与SQL进行沟通,并把INSERT命令传给数据库;在运行之前,让我们看一下处理Session和Transaction的代码。...Session在第一次被使用的时候,即第一次调用getCurrentSession()的时候,其生命周期就开始,然后它被Hibernate绑定到当前线程中,当事务结束的时候,不管是提交还是回滚,Hibernate...假若你再次调用getCurrentSession(),你会得到一个新的Session,并且开始一个新的工作单元,这种线程绑定(thread-bound)的编程模型(model)是使用Hibernate的最广泛的方式...网络配图 好了,这一节的学习先到这里,后面章节中会继续学习Hibernate。我们学习方式是每一节学习一个知识点(每天花10分钟学习)。

    49970

    在Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值?

    粗略地想想,EF这样设计也无可厚非:Insert存储过程用于添加一条全新的记录,自然应该采用当前值;而Delete存储过程用于删除一条现有的记录,删除操作的筛选条件自然应该使用原始值。...但是,由于Delete存储过程默认使用的是实体对象的初始值,即使你在删除之前为Contact对象的LastUpdatedBy属性设置了新的值,该值也不可能传入到存储过程中去。...在Entity Framework中使用存储过程(一):实现存储过程的自动映射 在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?...在Entity Framework中使用存储过程(三):逻辑删除的实现与自增长列值返回 在Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值?...在Entity Framework中使用存储过程(五):如何通过存储过程维护多对多关系?

    1.8K100

    springboot实战之ORM整合(JPA篇)

    前言 1、什么是ORM 对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。...: update properties: hibernate.format_sql: true database-platform: org.hibernate.dialect.MySQL5InnoDBDialect...,在springboot2版本中,默认mysql数据库存储引擎的是MyISAM,通过把取值设置为org.hibernate.dialect.MySQL5InnoDBDialect,就可以把默认的存储引擎切换为...@GeneratedValue 指定如何标识属性可以被初始化,例如自动、手动、或从序列表中获得的值 @Column 指定持久属性栏属性。...@MappedSupperclass 用来申明一个超类,继承这个类的子类映射时要映射此类中的字段 @CreationTimestamp 数据库做插入时,自动填充时间 @UpdateTimestamp

    6.1K20

    【极光系列】springBoot集成Hibernate

    【极光系列】springboot集成hibernate gitee地址 直接下载可用 https://gitee.com/shawsongyue/aurora.git 模块:aurora_hibernate...--配置Maven项目中需要使用的远程仓库--> aliyun-repos...#validate :每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。 #none : 什么都不做。...@GeneratedValue 注解指定了主键的生成策略* @Column 注解用于指定实体类属性映射到的数据库列名* @Transient 映射数据表和对象关系时候就不会报在表中不存在该字段* @CreationTimestamp...插入数据时自动更新时间 package com.aurora.entity; import com.fasterxml.jackson.annotation.JsonFormat; import org.hibernate.annotations.CreationTimestamp

    20710

    MySQL使用存储过程批量更新数据库所有表某个字段值

    当时添加表的时候没有设置默认值,现在要对二三十张表某个字段,如对 del_flag 设置默认值为0,怎么做呢?一张表一张表地设置比较蠢,如何实现批量操作呢?比如查出所有的表名,然后来一个循环操作。...是的,没错,可以使用存储过程。...下面是对 sens_blog 这个库的所有的表中的 del_flag 设置默认值的示例 -- 如果存储过程存在就删除 DROP PROCEDURE IF EXISTS updateColumn; CREATE...DECLARE flag INT DEFAULT 0; -- 保存表名 DECLARE tname VARCHAR(50); -- 查询数据库sens_blog中含有del_flag列的表,如果区分大小写使用...游标指向下一个位置,可以有多个数据,比如FETCH result INTO tname,ttype,...; FETCH result INTO tname; -- 拼接字符串表名sql,根据需要使用

    5.1K30

    在Entity Framework中使用存储过程(三):逻辑删除的实现与自增长列值返回

    本篇文章通过实例的方式,讨论两个在EF使用存储过程的主题:如何通过实体和存储过程的映射实现逻辑删除;对于具有自增长类型主键的数据表,在进行添加操作的时候如何将正确的值反映在实体对象上。...,不是就行Delete操作,而是进行Update操作,将IS_DELETED的值设置成1即可,这样的存储过程定义如下: 1: CREATE PROCEDURE P_CONTACT_D 2:...(一):实现存储过程的自动映射 在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?...在Entity Framework中使用存储过程(三):逻辑删除的实现与自增长列值返回 在Entity Framework中使用存储过程(四):如何为Delete存储过程参数赋上Current值?...在Entity Framework中使用存储过程(五):如何通过存储过程维护多对多关系?

    1.7K80

    微服务架构之Spring Boot(四十四)

    hibernate.globally_quoted_identifiers 属性的值 true 传递给Hibernate实体管理器。...还有一个 spring.jpa.generate-ddl 标志,但如果Hibernate自动配 置处于活动状态,则不会使用它,因为 ddl-auto 设置更精细。...⇐ 立即查看 Spring数据包括JDBC的存储库支持,并将自动为 CrudRepository 上的方法生成SQL。对于更高级的查询,提供了 @Query 注释。...当必要的依赖项在类路径上时,Spring Boot将自动配置Spring数据的JDBC存储库。可以使用 spring-boot-starter-data-jdbc 上的单个依 赖项将它们添加到项目中。...如果您没有使用Spring Boot的开发人员工具但仍想使用H2的控制台,则可以使用值 true 配置 spring.h2.console.enabled 属性。

    1.4K20

    旧调重弹Hibernate与Ibatis区别——深入架构设计

    程序员甚至不需要对sql 的熟练掌握, hibernate/ojb 会根据制定的存储逻辑,自动生成对应的sql 并调用jdbc 接口加以执行。 ...系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的sql语句(或存储过程)才能达到系统性能设计指标。在这种情况下ibatis会有更好的可控性和表现。...规范) 生成对应实体类的映射文件并添加到1中的配置文档 这里科普下IBatis的详细配置及使用情况!...); Pool.TimeToWait:当线程试图从连接池中获取连接时,连接池中无可用连接可供使用,此时线程将进入等待状态,直到池中出现空闲连接。...毫秒)的连接进行检测; Pool.PingConnectionsNotUsedFor:对空闲超过设定值(毫秒)的连接进行检测; 再看看Hibernate配置文件 <!

    61140

    什么是JPA?Java Persistence API简介

    对象映射是可配置的,但默认值往往效果很好。 图1说明了JPA和ORM层在应用程序开发中的作用。 ? 配置Java ORM层 设置新项目以使用JPA时,需要配置数据存储区和JPA提供程序。...您将配置数据存储连接器以连接到您选择的数据库(SQL或NoSQL)。您还将包含和配置JPA提供程序,它是一个框架,如Hibernate或EclipseLink。...然后,对象上的字段用于提供SQL insert语句的值。(PreparedStatement该类是JDBC的一部分,提供了一种将值安全地应用于SQL查询的方法。)...JPA中的元数据注释 清单3中的魔力是配置的结果,该配置是使用JPA的注释创建的。开发人员使用注释来告知JPA应该保留哪些对象,以及如何保留它们。...例如,您可以使用JPA的@Table注释来指定应该存储Musician类的表。 清单5.

    10.3K30

    计量单位及数据校验解读

    (天) WEEKS(周) MONTHS(月) YEARS(年) DECADES(十年) CENTURIES(世纪) MILLENNIA(千年) NANOS(纳秒) MICROS(微秒) MILLIS(毫秒...) SECONDS(秒) MINUTES(分钟) HOURS(小时) DataSize:表示存储空间,可以通过@DataSizeUnit注解描述存储空间单位,例如上例中描述的单位为MB(DataUnit.MEGABYTES...在JAVAEE的JSR303规范中给出了具体的数据校验标准,开发者可以根据自己的需要选择对应的校验框架,此处使用Hibernate提供的校验框架来作为实现进行数据校验。...--使用hibernate框架提供的校验器做实现--> org.hibernate.validator hibernate-validator 步骤②:在需要开启校验功能的类上使用注解@Validated开启校验功能 @Component @Data

    18420

    Spring Security技术栈开发企业级认证与授权(三)表单校验以及自定义校验注解开发

    Hibernate不仅仅为操作数据库提供了解决方案,还为数据校验提供了解决方案——Hibernate Validator。...本篇博客将介绍常用的Validator注解的使用以及在Validator不满足实际需求的情况下如何使用自定义Validator来实现数据校验。...一、常见的数据校验注解 首先我们需要在项目的POM文件中添加Hibernate Validator的依赖才可以使用它的数据校验器进行数据校验。...@Past 值必须是过去的日期 @Max(value=) 值必须小于等于value指定的值,不能注释在字符串类型属性上 @Min(value=) 值必须大于等于value指定的值,不能注释在字符串类型属性上...而是未来一年的时间,LocalDateTime.now()获取当前时间,plusYears(1)加上一年,atZone(ZoneId.systemDefault())设置当前时区为系统默认时区,最后再毫秒化

    62921

    野谈系列之高性能可定制化分布式发号器

    ,咱们应该感恩这个时代;随着互联网在中国越来越普及化,单机系统或者一个小系统已经无法满足需要,随着用户逐渐增多,数据量越来越大,单个应用或者单个数据库已经无法满足需求,在应用以至于微服务来临,在数据库存储方面分库分表来临...Hibernate的CustomVersionOneStrategy.java,解决了之前version 1的两个问题 时间戳(6bytes, 48bit):毫秒级别的,从1970年算起,能撑8925...顺序号(2bytes, 16bit, 最大值65535): 没有时间戳过了一毫秒要归零的事,各搞各的,short溢出到了负数就归0。...可见,MongoDB的每一个字段设计都比Hibernate的更合理一点,时间戳是秒级别的,自增序列变长了,进程标识变短了。总长度也降到了12 bytes 96bit。...自增序列(12bit,最大值4096):毫秒之内的自增,过了一毫秒会重新置0。 DataCenter ID (5 bit, 最大值32):配置值,支持多机房。

    49430

    应用对持久数据的管理 | 从开发角度看应用架构7

    Java对象和数据库表使用不同的数据类型(例如Java中的String和数据库中的Varchar)来存储业务数据。...在Java中,entity是一个简单的旧Java对象(POJO)类,它使用@Entity注释进行了注释。 entity类中的所有字段默认存储在数据库中,并称为持久字段。...JPA注释 我们使用注释的方法,来修饰java类、配置、查询、元数据的映射方法映射,配置,查询,验证等。...@Temporal @Temporal注释与Date类型的属性一起使用。数据库以不同于Java类的方式存储日期。...这是用于生成ID值的单独表格。 ID生成表格有两列。 第一列是标识生成器序列的字符串,第二列是存储ID序列的整数值。

    2.7K40

    【Android 应用开发】Android资源文件 - 使用资源存储字符串 颜色 尺寸 整型 布尔值 数组

    , 给源码阅读和维护带来很多麻烦, 在重构领域我们将这些数值成为 Magical Number; 改进魔法数值 : 为了改进魔法数值分散在程序各个地方, 可以专门定义存储魔法数值的接口, 在这些接口中以常量的形式定义一系列的魔法数值..., 这些常量名称都是容易理解的, 如果逻辑复杂的数值可以使用注释进行解析, 这样能大大 提高程序的 可读性 和 可维护性; 使用资源存放字符串,数字常量 : Android中可以将 字符串 数值 存放到资源文件中...) 来表示的; -- 颜色开头 : 颜色值总是以 # 开头; -- 无透明度 : 如果没有 alpha 值, 默认完全不透明; 颜色定义形式 :  -- #RGB : 红 绿 蓝 三原色值, 每个值分16...个等级, 最小为0, 最大为f; -- #ARGB : 透明度 红 绿 蓝 值, 每个值分16个等级, 最小为0, 最大为f; -- #RRGGBB : 红 绿 蓝 三原色值, 每个值分 256个等级,...使用字符串 颜色 尺寸资源 (1) 使用示例 颜色资源 :  <?xml version="1.0" encoding="utf-8"?

    61340
    领券