2012-11-13 36 views
21

Tôi có một ứng dụng JPA 2 (với Hibernate 3.6 là triển khai JPA) sử dụng Postgresql (với trình điều khiển JDBC 9.0-801.jdbc3).Cách ánh xạ postgresql "dấu thời gian với múi giờ" trong thực thể JPA 2

Tôi gặp sự cố khi ánh xạ các trường "dấu thời gian với múi giờ" vào các thực thể JPA của tôi.

Dưới đây là một ví dụ:

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) 
) 

Tôi đã cố gắng để ánh xạ như sau:

@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 */ 

tôi tiếp tục nhận được một ngoại lệ với nguyên nhân gốc rễ sau: Caused by: org.hibernate.HibernateException: Wrong column type in public.backend_themetopic for column created. Found: timestamptz, expected: date

gì Tôi đã thử

  • thay thế java.util.Calendar với java.util.Date - đã có sự khác biệt
  • sử dụng java.sql.Timestamp - phàn nàn rằng tôi không thể áp dụng các @Temporal chú thích để một Timestamp
  • sử dụng org.joda.time.DateTime với một tuỳ chỉnh @Type chú thích (@Type(type="org.joda.time.contrib.hibernate.PersistentDateTimeTZ")) cũng đã không làm việc

Ràng buộc

  • Ứng dụng này tương tác với một "hệ thống di sản" - vì vậy, thay đổi các loại các trường ngày không phải là một lựa chọn tốt

Câu hỏi của tôi là: làm thế nào tôi nên bản đồ các múi giờ timestamps biết thành thực thể JPA của tôi?

Trả lời

6

Cuối cùng tôi đã thực hiện "công việc" này - theo cách sắp xếp - bằng cách tắt xác thực lược đồ.

Trước đây, tôi đã có <property name="hibernate.hbm2ddl.auto" value="validate"/>"hibernate.hbm2ddl.auto" trong persistence.xml của mình. Khi tôi nhận xét thuộc tính này, máy chủ ứng dụng của tôi đã bắt đầu và mô hình "hoạt động".

Dạng thức của thực thể của tôi là:

@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 */ 

Sau khi đọc khá nhiều về vấn đề này, tôi có cảm giác là không có cách nào dễ dàng để lập bản đồ PostgreSQL timestamp với các cột múi giờ.

Một số kết hợp cơ sở dữ liệu thực hiện JPA + hỗ trợ nguyên bản này (EclipseLink + Oracle là một ví dụ). Đối với hibernate, với phần mở rộng jodatime, có thể lưu trữ các dấu thời gian nhận biết múi giờ bằng cách sử dụng dấu thời gian bình thường + trường varchar cho múi giờ (tôi không thể làm điều đó vì tôi đã bị hạn chế thay đổi giản đồ cơ sở dữ liệu). Jadira user types hoặc các loại người dùng hoàn toàn tùy chỉnh cũng có thể được sử dụng để giải quyết vấn đề này.

Tôi cần lưu ý rằng trường hợp sử dụng của tôi cho pháp nhân này là "chỉ đọc", vì vậy tôi có thể lấy đi bằng một giải pháp "ngây thơ" có vẻ ngây thơ.

5

Thêm @Column(columnDefinition= "TIMESTAMP WITH TIME ZONE")

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

Đây có phải là thực sự hữu ích chỉ dành cho ô tô DDL hoặc trong thời gian chạy, quá? – cslotty

+0

Giá trị 'columnDefinition' chỉ được sử dụng trong DDL. Tuy nhiên, nếu cột bảng của bạn được tạo ra với DDL đó, nó sẽ gián tiếp ảnh hưởng đến các chi tiết cụ thể của hành vi thời gian chạy. –

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