2012-04-09 34 views
10

Tôi đang lưu trữ trường JodaTime DateTime vào cột timestamptz bằng cách sử dụng org.jadira.usertype:usertype.jodatime:1.9. Máy chủ ứng dụng có múi giờ +4. Máy chủ DB + múi giờ 9. new DateTime() kết quả trong ${currentTime+1hour}+9 trong đó +9 là múi giờ (giá trị chính xác là ${currentTime+5hours)+9).Thời gian Joda DateTime không chính xác lưu trữ trong cơ sở dữ liệu

Tôi chưa tìm thấy bất kỳ chủ đề liên quan nào. java.util.Date lưu trữ chính xác.

đối tượng tên miền có tính chất bản đồ sau:

static mapping = { 
    dateCreated sqlType:'timestamptz' 
} 

Làm thế nào tôi có thể lưu trữ DateTime chính xác?

Trả lời

4

Ok. Tôi đã dành 8 giờ để giải quyết vấn đề. Nếu bạn đang sử dụng dự án usertype để duy trì JodaTime, bạn phải đặt databaseZone thuộc tính của PersistentDateTime lớp bằng múi giờ máy chủ ứng dụng hiện tại (không phải cơ sở dữ liệu!).

Nhưng tốt hơn nên sử dụng official hibernate support. Nó giải quyết vấn đề ra khỏi hộp vì nó sử dụng java.utl.Date để tồn tại DateTimejava.util.Date vẫn kiên trì một cách chính xác theo mặc định

+9

hỗ trợ ngủ đông chính thức không mở rộng thành Hibernate 4.0. :-(mà bạn cần sử dụng usertype –

0

Hãy thử khởi động JVM với -Duser.timezone = UTC thành JAVA_OPTS theo cách đó vào thời gian trong một vùng và sau đó bạn có thể thực hiện các thao tác trên đó để chuyển đổi sang vị trí hiện tại của bạn.

+0

Đó là một cách tuyệt vời để đi - nhưng được cảnh báo rằng bạn không thể làm điều đó nếu bạn đã có ngày được lưu trữ trong một múi giờ trong DB. Nói cách khác, không có vấn đề gì đối với các dự án mới nhưng rất, rất thận trọng khi làm điều này cho những dự án có dữ liệu hiện có. – RedYeti

0

Fedor,

Tôi có quyền giả sử bạn đang sử dụng Oracle dấu thời gian VỚI cột TIME ZONE? Kiểu người dùng không hỗ trợ loại này (nghĩa là với TIME ZONE) do việc xử lý với JDBC khác nhau giữa các cơ sở dữ liệu, mặc dù dự án sẽ rất sẵn lòng chấp nhận các bản vá.

Có một số wrt thảo luận tốt Oracle ở đây: http://puretech.paawak.com/2010/11/02/how-to-handle-oracle-timestamp-with-timezone-from-java/

+0

chúng tôi đang sử dụng PostgreSQL timestamptz –

0

tôi đã giải quyết vấn đề này bằng cách tạo PersistentDateTime khác kéo dài AbstractVersionableUserType.

import java.sql.Timestamp; 

import org.hibernate.SessionFactory; 
import org.hibernate.usertype.ParameterizedType; 
import org.jadira.usertype.dateandtime.joda.columnmapper.TimestampColumnDateTimeMapper; 
import org.jadira.usertype.spi.shared.AbstractVersionableUserType; 
import org.jadira.usertype.spi.shared.IntegratorConfiguredType; 
import org.joda.time.DateTime; 

public class PersistentDateTime extends AbstractVersionableUserType<DateTime, Timestamp, TimestampColumnDateTimeMapper> implements ParameterizedType, IntegratorConfiguredType { 

@Override 
public int compare(Object o1, Object o2) { 
    return ((DateTime) o1).compareTo((DateTime) o2); 
} 

@Override 
public void applyConfiguration(SessionFactory sessionFactory) { 

    super.applyConfiguration(sessionFactory); 

    TimestampColumnDateTimeMapper columnMapper = (TimestampColumnDateTimeMapper) getColumnMapper(); 
    columnMapper.setDatabaseZone(null); 
    columnMapper.setJavaZone(null); 
} 
} 
8

Tôi gặp vấn đề tương tự. Chỉ định vùng ứng dụng và db trong cấu hình đã giải quyết được vấn đề.

  <prop key="jadira.usertype.autoRegisterUserTypes">true</prop> 
      <prop key="jadira.usertype.databaseZone">America/Los_Angeles</prop> 
      <prop key="jadira.usertype.javaZone">America/Los_Angeles</prop> 
+1

Cái này hoạt động cho Hibernate 4+ – Sudarshan

+1

Tệp này có tác dụng gì? – dgrant

9

Chỉ cần thiết lập các thuộc JPA:

<property name="jadira.usertype.autoRegisterUserTypes" 
      value="true"/> 
<property name="jadira.usertype.databaseZone" 
      value="jvm"/> 
<property name="jadira.usertype.javaZone" 
      value="jvm"/> 
+1

Tệp này có tác dụng gì? – dgrant

+0

@dgrant trong tệp persistence.xml của bạn – Hamish

+0

Có cách nào để thực hiện điều này mà không có tệp XML không? Dự án của tôi đang sử dụng chú thích thuần túy cho cấu hình cho đến thời điểm này ... – Jules

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