2012-01-23 19 views
7

Tôi đang làm việc để tạo một bộ phụ kiện chú thích JPA 2.0 cho việc thực tập của tôi. Ngay bây giờ, tôi tự hỏi khi nào chú thích @MapKeyTemporal là bắt buộc và khi nào tùy chọn ...TemporalType mặc định cho khóa bản đồ thời gian không có chú thích @MapKeyColumn hoặc @MapKeyTemporal là gì?

Tôi biết rằng khi bạn xác định cột của khóa bản đồ bằng cách sử dụng @MapKeyColumn, loại khóa sẽ được ánh xạ tới có thể được bắt nguồn bằng cách xem xét loại cột (và ngược lại là loại trong cột màu). Do đó, trong trường hợp này, không cần chú thích @MapKeyTemporal.

Khi bạn đính kèm chú thích @MapKeyTemporal, tên cột được mặc định là ATTRIBUTE + "_KEY".

Khi bạn không chú thích @MapKeyColumn và @MapKeyTemporal, tên cột được mặc định là ATTRIBUTE + "_KEY", nhưng loại mặc định là gì? Hay bạn phải nhận được một lỗi?

Tôi đã tìm kiếm một tình huống tương tự và tìm thấy @MapKeyEnumerated. Nó giống nhau vì nó liên quan đến @MapKeyColumn và đó là một giá trị có thể được ánh xạ tới nhiều kiểu dữ liệu (java.sql.Date/java.sql.Time/java.sql.Timestamp cho @MapKeyTemporal và EnumeratedType.ORDINAL/EnumeratedType.STRING cho @MapKeyEnumerated). Tôi đã tìm thấy một sự khác biệt: @MapKeyEnumerated có mặc định. Mặc định này là EnumeratedType.ORDINAL.

Câu hỏi của tôi: Khi sử dụng bản đồ có khóa bản đồ có loại cơ bản là loại thời gian, TemporalType mặc định (theo JPA 2.0) mà khóa bản đồ được chuyển đổi để lưu giữ là gì?

+0

Tự hỏi về việc đặt tiền thưởng cho việc này, nhưng tôi không chắc chắn tôi sẽ nhận được câu trả lời hay không. Ai đó có thể cho tôi biết làm thế nào để cải thiện câu hỏi của tôi vì vậy tôi sẽ có thể nhận được một câu trả lời (có thể với một tiền thưởng 50)? – Pimgd

Trả lời

3

Câu trả lời có vẻ là, không có loại mặc định khi java.util.Date hoặc java.util.Calendar được sử dụng làm khóa của bản đồ. Đặc điểm kỹ thuật chính nó (tôi xem xét javadocs giao với đặc điểm kỹ thuật như là một phần của đặc điểm kỹ thuật) là rất nghiêm ngặt về cách sử dụng MapKeyTemporal. Javadoc cho các tuyên bố MapKeyTemporal:

Chú thích này phải được chỉ định cho khóa bản đồ liên tục của loại Ngày và Lịch.

Tôi nghĩ với độ nghiêm ngặt như vậy, họ quên trường hợp bạn hiện diện, có thông tin loại từ thuộc tính được MapKey tham chiếu. Nó không có ý nghĩa quá nhiều để chỉ định kiểu trong trường hợp của MapKey, vì kiểu đã được xác định trong thực thể là giá trị của bản đồ. Cũng cho phép khả năng có kiểu thời gian khác nhau cho khóa của bản đồ cho trường tương ứng trong thực thể không được mong muốn.

Nếu MapKeyTemporal không được xác định và nếu không có cách nào khác để tìm ra loại chìa khóa, (thực hiện tham khảo, mặc dù nó không phải lúc nào sau đây đặc điểm kỹ thuật) EclipseLink tạo ngoại lệ sau đây:

org.eclipse.persistence.exceptions.ValidationException 
Exception Description: The attribute [map] from the entity class [class X] 
does not specify a temporal type. A temporal type must be specified for persistent 
fields or properties of type java.util.Date and java.util.Calendar. 
at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:126) 
+0

Điều này có nghĩa là @MapKeyTemporal luôn được yêu cầu hay chỉ khi không thể lấy được từ các chú thích khác? – Pimgd

+0

Thật khó để kết luận, bởi vì tài liệu là nghiêm ngặt hơn là cần thiết. Việc thực hiện tham chiếu chỉ "khi không thể lấy được" -ứng dụng. Đối với tôi có ý nghĩa hơn "luôn luôn", bởi vì sau đó không có vấn đề với xung đột giữa giá trị của MapKeyTemporal và TemporalType được chỉ định cho thuộc tính trong thực thể đích. –

0

Về cơ bản, bạn không yêu cầu nếu có một kiểu mặc định cho MapKeyTemporal nhưng nếu việc triển khai JPA 2.0 hoặc spec đang sử dụng một giá trị mặc định cho các kiểu Temporal.

Điều này ngụ ý rằng có một loại quan trọng hơn trong cơ sở dữ liệu giữa Ngày và Dấu thời gian, có thể không phải như vậy.

Ngoài ra nếu bạn có Lịch, việc triển khai có thể gọi getTime() và sau đó xây dựng một kiểu Sql mới từ đó, làm cách nào để quyết định triển khai?

Lời nhắc: Lý do đầu tiên cho sự tồn tại của thời gian chỉ đơn giản là vì một khóa với lớp java.util.Date có thể là một trong ba kiểu thời gian trong Java (Thời gian, Dấu thời gian và sql.Date), trong khi điều này không quan trọng trong Java, nó thực hiện trong một cơ sở dữ liệu nơi đây là những kiểu riêng biệt.

Nếu tôi không chỉ định loại thời gian, không có gì ngăn tôi không có các loại sql khác nhau cho cùng một thực thể, vi phạm khi chạy.

+0

Câu trả lời của bạn sẽ được dịch là "mặc định là nhà cung cấp/nhà cung cấp cụ thể". Tôi không tìm cách thực hiện cụ thể việc làm; Tôi đang tìm tiêu chuẩn của JPA, và nếu không có, thường được thực hiện mặc định nhất. – Pimgd

+0

Không, tôi không nghĩ bạn hiểu tôi. Tôi đã chứng minh rằng không có loại thời gian mặc định trong bất kỳ triển khai nào. – Gepsens

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