首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在JPA 2实体中映射postgresql“带有时区的时间戳”

如何在JPA 2实体中映射postgresql“带有时区的时间戳”
EN

Stack Overflow用户
提问于 2012-11-13 16:23:57
回答 2查看 34.8K关注 0票数 35

我有一个JPA2应用程序(使用Hibernate 3.6作为JPA实现),它使用Postgresql (带有9.0-801.jdbc3JDBC驱动程序)。

将"timestamp with time zone“字段映射到我的JPA实体时遇到了问题。

下面是一个示例:

代码语言:javascript
复制
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 )
)

我尝试映射如下:

代码语言:javascript
复制
@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 */

我不断得到一个异常,其根本原因如下:Caused by: org.hibernate.HibernateException: Wrong column type in public.backend_themetopic for column created. Found: timestamptz, expected: date

我尝试过的东西

  • java.util.Calendar替换为java.util.Date - made no difference
  • using java.sql.Timestamp -抱怨我无法将@Temporal批注应用于具有自定义org.joda.time.DateTime批注( @Type(type="org.joda.time.contrib.hibernate.PersistentDateTimeTZ") )的@Type注释也不起作用<代码>H219<代码>F220

Constraints

  • 此应用程序与“遗留系统”进行交互-因此,更改日期字段的类型不是一个好的选择

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

EN

回答 2

Stack Overflow用户

发布于 2012-11-14 15:19:39

我最终通过关闭模式验证,以一种类似于黑客的方式实现了这一“工作”。

以前,我的persistence.xml中有<property name="hibernate.hbm2ddl.auto" value="validate"/>"hibernate.hbm2ddl.auto"。当我注释掉这个属性时,我的应用服务器启动了,模型“工作”了。

我的实体的最终形式是:

代码语言:javascript
复制
@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 = "timestampt with time zone not null")
    @NotNull
    @Temporal(TemporalType.TIMESTAMP)
    private Date runTo;

    /* Getters, setters, .hashCode(), .equals() etc omitted */

在阅读了相当多之后,我得到的印象是,没有简单的方法来映射Postgresql时间戳与时区列。

一些JPA实现+数据库组合本身就支持这一点( EclipseLink + Oracle就是一个例子)。对于hibernate,使用jodatime扩展,可以使用普通的时间戳加上时区的varchar字段来存储时区感知的时间戳(我不能这样做,因为我受到限制,不能更改数据库模式)。也可以使用Jadira user types或完全自定义的用户类型来解决此问题。

我需要注意的是,我对这个实体的用例是“只读的”,所以我可以使用一个看似幼稚的“解决方案”。

票数 12
EN

Stack Overflow用户

发布于 2015-07-12 02:25:38

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

代码语言:javascript
复制
@Column(name = "run_from", columnDefinition= "TIMESTAMP WITH TIME ZONE")
@NotNull
@Temporal(TemporalType.TIMESTAMP)
private Date runFrom;
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13357487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档