2011-12-16 45 views
6

Tôi đang sử dụng Play! 1.2.4 và PostgreSQL 9.1. Tôi đã tạo một bảng có cột created_at, thuộc loại: timestamp without time zone. Nó có giá trị mặc định là now().Cách ánh xạ cột dấu thời gian thành loại JPA?

Sự cố xảy ra khi tôi tìm nạp dữ liệu bằng cách sử dụng lớp Thực thể của mình cho bảng này. Trường createdAt luôn quay lại null. Dưới đây là định nghĩa trường:

@Column(name="created_at", insertable=false) 
public java.sql.Date createdAt; 

Tất cả các trường khác được điền chính xác. Tôi đã thử thay đổi loại trường thành Date, Calendar, Timestamp, v.v. và đã thử thêm chú thích @Timestamp. Nhưng không có sự kết hợp nào đã thành công.

Cảm ơn bạn đã giúp đỡ!

Để tham khảo, dưới đây là DDL tôi đã sử dụng để tạo bảng.

CREATE TABLE Users 
(
    id serial  NOT NULL, 
    username text NOT NULL, 
    email text NOT NULL, 
    password_hash text NOT NULL DEFAULT 0, 
    created_at timestamp without time zone DEFAULT now(), 
    CONSTRAINT Users_pkey PRIMARY KEY (id), 
    CONSTRAINT Users_username_key UNIQUE (username) 
); 

Cập nhật: Tôi nghĩ rằng vấn đề đã làm với sử dụng JPA để chèn một kỷ lục. Cơ sở dữ liệu điền một giá trị mặc định là now() cho created_at, nhưng bằng cách nào đó Hibernate không biết về nó khi tìm nạp hàng đó.

Nếu tôi truy vấn một hàng đã tồn tại, trường createdAt được điền chính xác! OK ... điều này làm giảm vấn đề.

Trả lời

11

tôi không giải quyết vấn đề một cách chính xác, nhưng tôi đã làm việc xung quanh nó.

Thay vì có cơ sở dữ liệu cung cấp các giá trị mặc định của now(), tôi bày tỏ nó trong JPA với @PrePersist:

@Column(name="created_at", nullable=false) 
@Temporal(TemporalType.TIMESTAMP) 
public Date createdAt; 

@PrePersist 
protected void onCreate() { 
    createdAt = new Date(); 
} 

đó làm việc tốt! Cảm hứng lấy từ this answer. Tôi vẫn không chắc tại sao Hibernate không được cập nhật với giá trị mặc định đã được áp dụng trong cơ sở dữ liệu. Nó đã bị mắc kẹt suy nghĩ giá trị vẫn còn null.

2

Hãy thử điều này:

@Column(name="create_at", insertable=false) 
@Temporal(TemporalType.TIMESTAMP) 
private Date createAt; 
+0

Tôi đã thử, nhưng không được. Trường này vẫn đang trở lại null từ cơ sở dữ liệu. – slattery

+0

Hãy thử điều này sau đó '@Column (name =" create_at ", insertable = false, nullable = false)' –

+0

Truy vấn của bạn như thế nào? hoặc thử điều này: '@Column (name =" create_at ", insertable = false, columnDefinition =" now() ")' –

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