2012-05-30 34 views
16

Tôi đang sử dụng WebSphere 7 (Java EE 5) và OpenJPA 1.2.1.làm thế nào để lưu trữ ngày và thời gian với JPA trong Oracle?

Tôi có một đối tượng JPA với một thuộc tính "modifiedTimestamp", một cái gì đó như thế này:

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

Các lĩnh vực liên quan trong cơ sở dữ liệu Oracle là loại DATE.

tôi thiết lập ngày như vậy ...

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

... và nó được lưu trữ, nhưng khi tôi đọc nó trở lại thời gian trong ngày đã không được lưu trữ, nó cho phép trở lại như 24 : 00.

Đây có phải là điều JPA hay một thứ Oracle? Bất kỳ đề xuất được đánh giá rất nhiều!

Cảm ơn

+0

thực hiện jpa nào? –

+0

Câu hỏi hay - Tôi đang sử dụng WebSphere 7 (Java EE 5) và OpenJPA 1.2.1. –

+1

java.sql.Date chỉ lưu trữ ngày tháng, theo javadocs của nó. Có lẽ bạn muốn java.util.Date? – DataNucleus

Trả lời

29

Anotating lĩnh vực của bạn và thay đổi loại sẽ giúp:

@Temporal(TemporalType.TIMESTAMP) 
private java.util.Date modifiedTimestamp; 
+0

Lưu ý: Để làm cho nó hoạt động, tôi cũng đã thay đổi trường Oracle thành TIMESTAMP thay vì DATE. –

+0

Trong trường hợp của tôi (Oracle 11g) kiểu dữ liệu DATE trong Oracle cũng đang hoạt động. – CSchulz

+0

'Lịch' có chính xác hơn không? –

11

Sử dụng @Temporal(TemporalType.TIMESTAMP) (Javadocs). Kết hợp with java.util.Date.

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "DATE_FIELD") 
private java.util.Date modifiedTimestamp; 
+0

Cảm ơn @AnthonyAccioly, tôi muốn đánh dấu nó là chính xác bởi Eelke đánh bại bạn chỉ trong vài giây. :) –

+0

Cảm ơn @AnthonyAccioly, chú thích Cột bị thiếu trong trường hợp của tôi và được khắc phục với đề xuất của bạn. – MauricioTL

1

Nếu bạn thay đổi kiểu để java.sql.Timestamp sau đó cũng cần làm việc, mà không cần thêm @Temporal annotaion.

private java.sql.Timestamp modifiedTimestamp; 

Tất nhiên trong trường thay đổi Oracle thành TIMESTAMP.

1

Đây là cách tôi xử lý trường datetime trong Java, MySQL db và OpenJPA2. Tôi muốn trường là một loại java.util.Calendar, dbfield datetime và dbvalue là giá trị UTC. Mysql không biết gì về múi giờ nên việc sử dụng bộ chuyển đổi tùy chỉnh có thể đặt và đọc chuỗi "yyyy-MM-dd HH: mm: ss". Vẫn là cột sql datetime hợp lệ của nó và java.util.Calendar trong bean thực thể.

@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 là lớp tiện ích ngẫu nhiên của tôi để cung cấp một số chuyển đổi cơ bản.

Các vấn đề liên quan