2010-02-03 19 views
8

Chúng tôi có cột Ngày tháng Oracle. Đầu tiên trong lớp Java/Hibernate của chúng tôi, chúng tôi đã sử dụng java.sql.Date. Điều này làm việc nhưng nó dường như không lưu trữ bất kỳ thông tin thời gian nào trong cơ sở dữ liệu khi chúng ta lưu, vì vậy tôi đã thay đổi kiểu dữ liệu Java thành Dấu thời gian. Bây giờ chúng tôi nhận được lỗi này:Loại Java cho ngày/giờ khi sử dụng Oracle Date với Hibernate

springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.an notation.PersistenceExceptionTranslationPostProcessor#0' defined in class path resource [margin-service-domain -config.xml]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreatio nException: Error creating bean with name 'sessionFactory' defined in class path resource [m-service-doma in-config.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Wrong column type: CREATE_TS, expected: timestamp

Bất kỳ ý tưởng nào về cách ánh xạ Oracle Date trong khi giữ lại phần thời gian?


Cập nhật: Tôi có thể làm việc này nếu tôi sử dụng loại dữ liệu Oracle Timestamp nhưng tôi không muốn mức độ chính xác đó lý tưởng. Chỉ muốn cơ bản Oracle Date.

+0

bạn đang sử dụng hbm2ddl.auto? – Bozho

+0

Không biết đó là gì - vì vậy tôi đoán là không. –

+0

Nếu đó là chức năng tạo giản đồ tự động tạo ngủ đông, thì không. –

Trả lời

7

Không phải là một câu trả lời trực tiếp nhưng tôi muốn sử dụng các loại dấu thời gian Oracle:

  • TIMESTAMP (fractional_seconds_ precision) Year, month, and day values of date, as well as hour, minute, and second values of time, where fractional_seconds_precision optionally specifies the number of digits in the fractional part of the SECOND datetime field and can be a number in the range 0 to 9. The default is 6. For example, you specify TIMESTAMP as a literal as follows:

    TIMESTAMP'1997-01-31 09:26:50.124' 
    

với mong muốn fractional_second_precision.

+0

Ý tưởng hay. Được sử dụng với độ chính xác 2. Mục tiêu ban đầu là sử dụng Oracle 'Date' nhưng điều này hoạt động tốt. –

+1

Đây chỉ là công việc. Xem bình luận của tôi về câu trả lời của Brian là tại sao câu trả lời của anh là giải pháp cho câu hỏi ban đầu của bạn. –

+0

Khi tôi làm điều này, hibernate ánh xạ cột (bây giờ là kiểu dấu thời gian) thành một String thay vì một ngày trong Java. Bất kỳ ý tưởng tại sao? – kmehta

0

Bạn có tạo lại cơ sở dữ liệu sau khi thực hiện thay đổi này không?

Nếu Hibernate ban đầu tạo bảng bằng cách sử dụng một java.sql.Date cho cột, tôi không biết bất kỳ cách nào nó có thể thay đổi nó dựa trên một sự thay đổi trong mã Java một mình.

1

Trước hết - bạn nói đúng rằng bạn cần sử dụng lớp java.sql.Timestamp, vì lớp java.sql.Date rõ ràng không đại diện cho một thời gian cụ thể trong ngày (thay vào đó, nó cố gắng đại diện nửa đêm GMT).

Đối với lỗi của bạn - bạn không cung cấp đủ thông tin để làm bất cứ điều gì nhiều hơn dự đoán (nó sẽ yêu cầu xem cả cấu hình Hibernate và lớp để xác định nguyên nhân). Tuy nhiên, nếu bạn chỉ thay đổi lớp của trường trong lớp Java, thì tất nhiên bạn cũng sẽ phải cập nhật ánh xạ Hibernate. Nếu bạn đã không làm sau này thì điều này có thể sẽ dẫn đến sự không phù hợp của bạn. Hãy thử chỉ định rõ ràng type="timestamp" cho ánh xạ tương ứng.

EDIT: Nếu bạn đang sử dụng chú thích, bạn có cập nhật chú thích trên thuộc tính đó thành @Temporal(TemporalType.TIMESTAMP) không? Nếu bạn không, thì bạn sẽ cần (và nếu bạn đã làm, bạn nên đã nói như vậy :-)).

+0

Tôi đang sử dụng chú thích, không thấy trường 'loại 'khả dụng. –

+0

Đã thử rằng, cùng một lỗi. Tự hỏi nếu đó là một "điều mùa xuân". Lỗi này tham chiếu đến bean Spring ... –

8

Tôi luôn sử dụng java.util.Date với các ngày của Oracle và nó xử lý ngày và thời gian tốt.

+0

Đây là câu trả lời đúng. Câu trả lời của Pascal về việc sử dụng cột loại TIMESTAMP chỉ là một công việc xung quanh. Nếu bạn 'buộc' sử dụng cột loại DATE (ánh xạ Hibernate đến một lược đồ hiện có mà bạn không thể sửa đổi) thì bạn phải sử dụng java.util.Date và NOT java.sql.Date.Đây là một câu hỏi tương tự bao gồm các trường hợp này: http://stackoverflow.com/questions/960923/mapping-an-oracle-date-to-a-java-object-using-hibernate –

+1

Tôi sẽ không khuyên bạn nên điều này. Khi sử dụng java.util.Date, Hibernate ánh xạ tới TimestampType của nó. Sau đó, Oracle có thể truyền cột DATE thành TIMESTAMP để chỉ mục hiện tại sẽ không được sử dụng và hiệu suất sẽ thực sự tồi tệ. Sử dụng tốt hơn một dấu thời gian tất cả các cách thức thông qua. –

2

Có thể bạn có this problem? Đảm bảo bạn có trình điều khiển JDBC mới nhất, tên tệp phải là ojdbc5.jar.

0

Bạn cần phải sử dụng @type (type = "org.joda.time.contrib.hibernate.PersistentDateTime") cho cột được định nghĩa trong lớp thực thể

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