2011-07-06 45 views
7

Tôi có một thực thể với các lĩnh vựcON UPDATE CURRENT_TIMESTAMP và JPA

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "edit_timestamp", 
     columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") 
private Date editTimestamp; 

@Version 
@Column(name = "edit_count") 
private short editCount; 

private String text; 

Khi tôi cố gắng cập nhật với Spring-Data-JPA, tôi quan sát EDIT_COUNT đã được tăng lên, nhưng vẫn edit_timestamp vẫn như cũ. Nếu tôi tự gọi SQL

UPDATE post SET TEXT='456' WHERE post_id=1; 

edit_timestamp được cập nhật. Nếu tôi thêm

@PreUpdate 
protected void onUpdate() { 
    editTimestamp = new Date(); 
} 

nó hoạt động không thành vấn đề. Câu hỏi của tôi là tại sao w/o @PreUpdate edit_timestamp không được cập nhật?

+1

Để downvoter, vui lòng cung cấp bình luận của bạn ... –

Trả lời

6

Đây là một câu hỏi cũ, nhưng tôi nghĩ tôi sẽ trả lời trong trường hợp bất kỳ ai khác thấy nó hữu ích. Tôi nghĩ rằng bạn cần phải thay đổi chú thích cột để bao gồm updatable = false. Điều này sẽ làm cho cột edit_timestamp không hiển thị trong sql cập nhật, do đó nhà cung cấp JPA sẽ không bao gồm giá trị hiện tại của trường là điều khiến nó ghi đè lên giá trị mặc định.

@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "edit_timestamp", 
     updatable = false 
     columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP") 
private Date editTimestamp; 
+0

Đây là một phần hoạt động. Với updatable = false, cột edit_timestamp không hiển thị trong truy vấn cập nhật. Từ cơ sở dữ liệu, tôi quan sát edit_timestamp đã được cập nhật. Tuy nhiên, getter cho editTimestamp không nhận thức được giá trị cập nhật, vì nó không được kích hoạt bởi @PreUpdate, vì vậy nó vẫn trả về giá trị cũ. –

0

Vì trong bộ chú thích ban đầu của bạn, tất cả những gì bạn đã nói về cột edit_timestamp là nó là dấu thời gian; JPA không biết rằng nó cần phải cập nhật nó. Tôi đoán rằng khi bạn đang thực hiện câu lệnh SQL theo cách thủ công, bạn có một số loại kích hoạt cập nhật đang thay đổi các trường đó cho bạn - nhưng đang bị ghi đè bởi dữ liệu đến từ thực thể được lưu giữ khi bạn cập nhật nó.
Nếu bạn không cần số đếm/dấu thời gian 'đã chỉnh sửa', hãy thử xóa chúng khỏi thực thể và xem điều đó có hiệu quả không. Nếu không, bạn có một giải pháp làm việc.

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