2011-09-14 26 views
20

Có thể ai đó vui lòng giải thích cho tôi lý do JPA hỗ trợ loại double làm loại trường, nhưng xác thực bean được tô màu trong javax.validation.constraints (tức là @Min/@Max) không hỗ trợ? Tôi biết tài liệu nói rằng điều này là do lỗi làm tròn, nhưng nếu tôi chọn loại trường là double Tôi đã thừa nhận rằng tôi không quan tâm nhiều đến độ chính xác rõ ràng.Tại sao các xác nhận đậu Min/Max ràng buộc không hỗ trợ kiểu kép?

Kịch bản mà tôi gặp phải tình trạng khó xử này là như sau: Tôi có một thực thể đại diện cho một điểm trên bề mặt trái đất. Nếu độ chính xác trong vòng vài centimet thì tốt. Có vẻ như sau:

@Entity 
public class Point { 

    /** 
    * The longitude in radians. 
    */ 
    @Min(-Math.Pi) 
    @Max(Math.Pi) 
    double longitude; 
    /** 
    * The latitude in radians. 
    */ 
    @Min(-Math.Pi/2) 
    @Max(Math.Pi/2) 
    double latitude; 

} 

Thật không may điều này không có tác dụng, vì chú thích không hỗ trợ loại kép. Nhưng việc sử dụng BigDecimal thay vào đó không thực sự là một lựa chọn, bởi vì tôi có một số tính toán mở rộng với nhiều điểm đang diễn ra mà vẫn cần phải được hợp lý nhanh chóng. Tôi đã làm việc xung quanh nó bằng cách xác định một kiểm tra ràng buộc tùy chỉnh mà làm việc với double s, nhưng bằng cách nào đó tôi nghĩ rằng có cái gì đó tôi đang thiếu trong toàn bộ câu chuyện. Vì vậy, tôi đang thiếu gì?

+0

Xin lưu ý rằng JPA và Bean Validation là hai API hoàn toàn riêng biệt. Tôi đã sửa tiêu đề, một số từ ngữ và thẻ cho phù hợp. Brilliant ví dụ câu hỏi btw. Bạn đang sử dụng xác thực Bean Validation nào? Hibernate Validator? – BalusC

+0

Có, ngay bây giờ tôi đang sử dụng Trình xác thực Hibernate. –

+1

Bạn thực sự có thể chú thích một đôi với Min hoặc Max (ít nhất là trong Hibernate Validator). Loại đôi được hỗ trợ. Vấn đề của bạn dường như là bạn không thể chỉ định một đôi là tham số ràng buộc. Có spec thực sự thực thi một thời gian dài. Bạn đã cân nhắc sử dụng DecimalMin và DecimalMax chưa? Bạn có thể chỉ định các giá trị tối thiểu và tối đa của mình dưới dạng chuỗi. – Hardy

Trả lời

6

Đó là do làm tròn. Nhưng không phải vì vấn đề mà một đôi có thể không đủ chính xác để thể hiện số bạn muốn. Giá trị chú thích (của MinMax) là dài, do đó, nó không thể biểu thị bất kỳ số nào có số thập phân. Mặt khác, bạn không thể sử dụng một đôi để thể hiện chính xác tất cả các con số mà một con số dài có thể diễn tả.

Vì vậy, các nhà thiết kế API phải quyết định một trong hai cách (dài hoặc đôi)

+0

Cảm ơn thông tin chi tiết đó, tôi đã không xem xét nó từ quan điểm đó. Nhưng vì 'long' và' double' đều sử dụng 64 bit, nên có một đẳng cấu duy trì sự so sánh. Tôi đoán sự đẳng cấu này không được xây dựng trong 'Double' hoặc' Float' nhưng nó không phải là một vấn đề phức tạp hơn việc chuyển đổi 'BigDecimal' thành' long'. Vì vậy, điều này giải thích tại sao sự hỗ trợ cho 'double' không được tích hợp sẵn, nhưng nó cho thấy rằng nó là có thể. Và đó là đủ để được hỗ trợ, IMO. –

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