PostgreSQL时区JPA映射的Java数据类型是什么?

PostgreSQL时区JPA映射的Java数据类型是什么?,java,postgresql,spring-boot,jpa,spring-data-jpa,Java,Postgresql,Spring Boot,Jpa,Spring Data Jpa,我正在使用JDK15和Java15,SpringBootVersion2.3.4.RELEASE,FreeMarker,PostgreSQL13 PostgreSQL时区JPA映射的Java数据类型是什么 文件application.properties 数据库 创建表public.inventory\u项目 id整数, 库存商品名称字符VARING1024不为空, 制造商id整数, 创建带时区的时间, 带时区的修改时间, 用户创建的整数, 用户_修改的整数, 库存\项目\类型\ id整数, 原

我正在使用JDK15和Java15,SpringBootVersion2.3.4.RELEASE,FreeMarker,PostgreSQL13

PostgreSQL时区JPA映射的Java数据类型是什么

文件application.properties

数据库

创建表public.inventory\u项目 id整数, 库存商品名称字符VARING1024不为空, 制造商id整数, 创建带时区的时间, 带时区的修改时间, 用户创建的整数, 用户_修改的整数, 库存\项目\类型\ id整数, 原价编号222, 主键id ; 更改表public.inventory\u项目 博士后的所有者; 此实体映射在创建和修改时导致错误

包com.example.demo.entity; 导入javax.persistence.Basic; 导入javax.persistence.Column; 导入javax.persistence.Entity; 导入javax.persistence.Id; 导入javax.persistence.Table; 导入java.math.biginger; 导入java.util.Date; 导入java.util.Objects; @实体 @Tablename=库存\项目,schema=public,catalog=freemarker 公共类清单项{ 私有整数id; 私有字符串inventoryItemName; 私有整数制造厂; 创建私人日期; 修改私人日期; 创建私有整数用户; 私有整数用户修改; 私有整数inventoryItemTypeId; 私有大整数原价; @身份证 @Columnname=id 公共整数getId{ 返回id; } 公共无效集合标识符{ this.id=id; } @基本的 @Columnname=存货\项目\名称 公共字符串getInventoryItemName{ 返回inventoryItemName; } public void setInventoryItemNameString inventoryItemName{ this.inventoryItemName=inventoryItemName; } @基本的 @Columnname=制造商id 公共整数getManufactorId{ 返回制造厂; } public void setManufactoridIntegrater manufactorId{ this.manufactorId=manufactorId; } @基本的 @Columnname=已创建 创建公共日期{ 创建回报; } 已创建公共void setCreatedDate{ this.created=created; } @基本的 @Columnname=已修改 修改公共日期{ 修改返回值; } 公共void setModifiedDate已修改{ this.modified=modified; } @基本的 @Columnname=用户\已创建 公共整数getUserCreated{ 返回已创建的用户; } public void setUserCreatedInteger userCreated{ this.userCreated=userCreated; } @基本的 @Columnname=用户\已修改 公共整数getUserModified{ 返回userModified; } public void setUserModifiedInteger userModified{ this.userModified=userModified; } @基本的 @Columnname=库存\项目\类型\ id 公共整数getInventoryItemTypeId{ 返回inventoryItemTypeId; } public void setInventoryItemTypeId集成器inventoryItemTypeId{ this.inventoryItemTypeId=inventoryItemTypeId; } @基本的 @Columnname=原价 公共大整数getOriginalPrice{ 返回原价; } 公共无效设置原始价格原始价格{ this.originalPrice=originalPrice; } @凌驾 公共布尔等式对象{ 如果此==o,则返回true; 如果o==null | | getClass!=o.getClass返回false; InventoryItem,其=InventoryItem o; 返回Objects.equalsid,即.id&& Objects.equalInventoryItemName,that.inventoryItemName&& Objects.equalsmanufactorId,that.manufactorId&& Objects.equalscreated,that.created&& Objects.equalsmodified,that.modified&& Objects.equalsuserCreated,that.userCreated&& Objects.equalsuserModified,that.userModified&& Objects.equalInventoryItemTypeId,that.inventoryItemTypeId&& Objects.equaloriginalprice,即.originalPrice; } @凌驾 公共整数哈希码{ return Objects.hashid、inventoryItemName、manufactorId、created、modified、userCreated、userModified、inventoryItemTypeId、originalPrice; } } 我完全知道映射导致的问题

创建带时区的时间, 带时区的修改时间, 及

创建私人日期; 修改私人日期; 如何修复它?

试试ZoneDateTime

private Integer id;
private String inventoryItemName;
private Integer manufactorId;
private ZonedDateTime created;
private ZonedDateTime modified;
private Integer userCreated;
private Integer userModified;
private Integer inventoryItemTypeId;
private BigInteger originalPrice;

@Id
@Column(name = "id")
public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

@Basic
@Column(name = "inventory_item_name")
public String getInventoryItemName() {
    return inventoryItemName;
}

public void setInventoryItemName(String inventoryItemName) {
    this.inventoryItemName = inventoryItemName;
}

@Basic
@Column(name = "manufactor_id")
public Integer getManufactorId() {
    return manufactorId;
}

public void setManufactorId(Integer manufactorId) {
    this.manufactorId = manufactorId;
}

@Basic
@Column(name = "created")
public ZonedDateTime getCreated() {
    return created;
}

public void setCreated(ZonedDateTime created) {
    this.created = created;
}

@Basic
@Column(name = "modified")
public ZonedDateTime getModified() {
    return modified;
}
试试分区约会

private Integer id;
private String inventoryItemName;
private Integer manufactorId;
private ZonedDateTime created;
private ZonedDateTime modified;
private Integer userCreated;
private Integer userModified;
private Integer inventoryItemTypeId;
private BigInteger originalPrice;

@Id
@Column(name = "id")
public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}

@Basic
@Column(name = "inventory_item_name")
public String getInventoryItemName() {
    return inventoryItemName;
}

public void setInventoryItemName(String inventoryItemName) {
    this.inventoryItemName = inventoryItemName;
}

@Basic
@Column(name = "manufactor_id")
public Integer getManufactorId() {
    return manufactorId;
}

public void setManufactorId(Integer manufactorId) {
    this.manufactorId = manufactorId;
}

@Basic
@Column(name = "created")
public ZonedDateTime getCreated() {
    return created;
}

public void setCreated(ZonedDateTime created) {
    this.created = created;
}

@Basic
@Column(name = "modified")
public ZonedDateTime getModified() {
    return modified;
}

根据PostgreSQL文档第节,时区存储时间:

一天中的时间无日期,带时区

在Java中,最佳匹配是:

在ISO-8601日历系统中,与UTC/Greenwich有偏移的时间,例如10:15:30+01:00

OffsetTime是一个不可变的日期-时间对象,表示时间,通常被视为小时-分钟-秒偏移量。此类将所有时间字段存储到 纳秒精度,以及区域偏移。例如,值13:45.30.123456789+02:00可以存储在OffsetTime中

但是,请注意,PostgreSQL文档说明:

我们不建议使用time with time zone类型,尽管PostgreSQL支持该类型用于遗留应用程序,并符合SQL标准


根据PostgreSQL文档第节,时区存储时间:

一天中的时间无日期,带时区

在Java中,最佳匹配是:

在ISO-8601日历系统中,与UTC/Greenwich有偏移的时间,例如10:15:30+01:00

OffsetTime是一个不可变的日期-时间对象,表示时间,通常被视为小时-分钟-秒偏移量。此类存储所有时间字段(精度为纳秒)以及区域偏移。例如,值13:45.30.123456789+02:00可以存储在OffsetTime中

但是,请注意,PostgreSQL文档说明:

我们不建议使用time with time zone类型,尽管PostgreSQL支持该类型用于遗留应用程序,并符合SQL标准


根据PostgreSQL文档,第节,带时区的时间存储一天中的时间无日期,带时区,因此ZonedDateTime肯定是不正确的。根据PostgreSQL文档,第节,带时区的时间存储一天中的时间无日期,带时区,所以ZonedDateTime绝对不正确。为什么要将创建/修改值存储为时间小时、分钟、秒,而不包含日期年、月、日?如果您不知道上次修改的时间是多少天前,那么知道上次修改的时间是下午3:14有什么好处?您可能是想在时区中使用时间戳,而不是在时区中使用时间戳吗?我们在java中在postgres版本11中使用offsetDatetime,效果很好。@Vignesh_使用offsetDatetime可以很好地用于不存储日期年、月、日、仅时间小时、分钟、秒和区域偏移的列?我发现这很难相信。@Vignesh_A OffsetDateTime不是只存储一天中的时间而不引用日期的列的正确数据类型。-您真的应该在时区中使用时间戳为什么要将创建/修改值存储为时间小时、分钟、秒,而不包括日期年、月、日?如果您不知道上次修改的时间是多少天前,那么知道上次修改的时间是下午3:14有什么好处?您可能是想在时区中使用时间戳,而不是在时区中使用时间戳吗?我们在java中在postgres版本11中使用offsetDatetime,效果很好。@Vignesh_使用offsetDatetime可以很好地用于不存储日期年、月、日、仅时间小时、分钟、秒和区域偏移的列?我发现这很难相信。@Vignesh_A OffsetDateTime不是只存储一天中的时间而不引用日期的列的正确数据类型。-你真的应该在时区上使用时间戳