20

我正在使用 WebSphere 7 (Java EE 5) 和 OpenJPA 1.2.1。

我有一个带有“ modifiedTimestamp”属性的 JPA 对象,如下所示:

@Entity
public class Widget {
  /* ... */
  private java.sql.Date modifiedTimestamp;
  /* ... */
}

Oracle 数据库中的相关字段类型为DATE

我这样设置日期...

myWidget.setModifiedTimestamp(new java.sql.Data(System.currentTimeMillis());

...它被存储了,但是当我读回它时,一天中的时间还没有被存储,它允许返回为 24:00。

这是 JPA 的事情,还是 Oracle 的事情?任何建议都非常感谢!

谢谢

4

5 回答 5

36

注释您的字段并更改类型应该会有所帮助:

@Temporal(TemporalType.TIMESTAMP)
private java.util.Date modifiedTimestamp;
于 2012-05-30T16:02:19.757 回答
13

使用@Temporal(TemporalType.TIMESTAMP)( Javadocs )。结合java.util.Date

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "DATE_FIELD")
private java.util.Date modifiedTimestamp;
于 2012-05-30T16:03:19.297 回答
1

我看到这个问题已经被问过一段时间了,所以我建议阅读这篇文章。引入 java 8 日期类型后有一些变化。我知道这不是这个问题的答案,我遇到的问题不同,但我发布这个是因为@Temporal()我在答案中看到的注释破坏了我的 CI 管道:

这有效:

@NotNull
@Column(nullable = false, columnDefinition = "TIME") // this bit is different
@JsonFormat(pattern="HH:mm")
private LocalTime startTime;

这不会:

@NotNull
@Column(nullable = false)
@Temporal(TemporalType.TIME)
@JsonFormat(pattern="HH:mm")
private LocalTime startTime;
于 2021-07-26T12:53:31.153 回答
0

如果您将类型更改为java.sql.Timestampthen 它也应该可以工作,而无需添加@Temporal注释。

private java.sql.Timestamp modifiedTimestamp; 

当然在 Oracle 中将字段更改为 TIMESTAMP。

于 2012-06-01T08:47:02.577 回答
0

这就是我在 Java、MySQL db 和 OpenJPA2 中处理日期时间字段的方式。我希望字段是 java.util.Calendar 类型,dbfield datetime 和 dbvalue 作为 UTC 值。Mysql 对时区一无所知,因此使用自定义转换器可以设置和读取“yyyy-MM-dd HH:mm:ss”字符串。仍然是实体 bean 中的有效日期时间 sql 列和 java.util.Calendar。

@Entity @Table(name="user") @Access(AccessType.FIELD)
public class User {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;    // primary key (autogen surrogate)

    private String name;

    @Column(name="updated_utc") // use custom serializer so that UTC-stringified
    @Temporal(TemporalType.TIMESTAMP) // db datetime is properly set to calendar instance
    @Factory("JPAUtil.db2calendar") @Externalizer("JPAUtil.calendar2db")
    private Calendar updated;

    public long getId() { return id; }
    public void setId(long id) { this.id = id; }

    public String getName() { return name; }
    public void setName(String name) { this.name=name; }

    public Calendar getUpdated() { return updated; }
    public void setUpdated(Calendar cal) { updated=cal; }

}

- - - 

public class JPAUtil {
    public static final TimeZone TIMEZONE_UTC = TimeZone.getTimeZone("UTC");

    public static String calendar2db(Calendar val, StoreContext ctx) {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        df.setTimeZone(TIMEZONE_UTC);
        return df.format(cal.getTime()); // return date as UTC string value
    }

    public static Calendar db2calendar(String val, StoreContext ctx) {
        try {
            // returned calendar is using a default timezone, val was set as utc string
            return DateUtil.parseDateTimeFromUTC(val);
        } catch (Exception ex) { 
            return null;
        }
    }

}

- - - 

CREATE TABLE user (
  id bigint NOT NULL auto_increment,
  name varchar(64) NOT NULL default '',
  updated_utc datetime NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY USERNAME (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

ps:DateUtil 是我的随机工具类,提供一些基本的转换。

于 2013-03-27T11:57:24.063 回答