如何在JPA 2实体中Mappostgresql“时间戳与时区”

cwtwac6a  于 2023-01-09  发布在  PostgreSQL
关注(0)|答案(2)|浏览(194)

我有一个JPA 2应用程序(使用Hibernate 3.6作为JPA实现),它使用Postgresql(使用9.0 - 801.jdbc3 JDBC驱动程序)。
我在将"带时区的时间戳"字段Map到JPA实体时遇到了麻烦。
下面是一个例子:

CREATE TABLE theme
(
  id serial NOT NULL,
  # Fields that are not material to the question have been edited out
  run_from timestamp with time zone NOT NULL,
  run_to timestamp with time zone NOT NULL,
  CONSTRAINT theme_pkey PRIMARY KEY (id ),
  CONSTRAINT theme_name_key UNIQUE (name )
)

我试着画出如下的图:

@Entity
@Table(schema = "content", name = "theme")
public class Theme extends AbstractBaseEntity {
    private static final long serialVersionUID = 1L;

    @Column(name = "run_from")
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date runFrom;

    @Column(name = "run_to")
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date runTo;

    /* The rest of the entity has been edited out */

我不断收到具有以下根本原因的异常:第一个月
"我所尝试的"

  • java.util.Calendar替换为java.util.Date-无差异
  • 使用java.sql.Timestamp-抱怨我无法将@Temporal注解应用于Timestamp
  • org.joda.time.DateTime与自定义@Type注解(@Type(type="org.joda.time.contrib.hibernate.PersistentDateTimeTZ"))一起使用也不起作用
    • 制约因素**
  • 此应用程序与"遗留系统"交互-因此,更改日期字段的类型不是一个好的选择

我的问题是:我应该如何将这些时区感知时间戳Map到我的JPA实体中?

oknwwptz

oknwwptz1#

添加@Column(columnDefinition= "TIMESTAMP WITH TIME ZONE")

@Column(name = "run_from", columnDefinition= "TIMESTAMP WITH TIME ZONE")
@NotNull
@Temporal(TemporalType.TIMESTAMP)
private Date runFrom;
3xiyfsfu

3xiyfsfu2#

我最终通过关闭模式验证--以一种黑客式的方式--使这个“工作”起来。
以前,我的persistence.xml中有<property name="hibernate.hbm2ddl.auto" value="validate"/>"hibernate.hbm2ddl.auto",当我注解掉这个属性时,我的应用服务器启动了,模型“工作”了。
我的实体的最终形式是:

@Entity
@Table(schema = "content", name = "theme")
public class Theme extends AbstractBaseEntity {
    private static final long serialVersionUID = 1L;

    @Column(name = "run_from", columnDefinition = "timestamp with time zone not null")
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date runFrom;

    @Column(name = "run_to", columnDefinition = "timestamp with time zone not null")
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date runTo;
    
    /* Getters, setters, .hashCode(), .equals() etc omitted */

在阅读了相当多关于这方面的内容后,我得到的印象是,没有简单的方法可以将Postgresql时间戳与时区列Map在一起。
一些JPA实现+数据库组合本机支持此功能(EclipseLink + Oracle是一个例子)对于Hibernate,使用jodatime扩展,可以使用正常时间戳+时区的varchar字段来存储时区感知时间戳(我不能这样做,因为我不能更改数据库模式)。X1 E0 F1 X或完全定制的用户类型也可用于解决该问题。
我需要注意的是,这个实体的用例是“只读”的,所以我可以用一个看起来很幼稚的“解决方案”。

相关问题