2013-07-01 32 views
8

Trình tạo đối tượng Jpa gán kiểu Integer cho các trường id của các thực thể của tôi. Thuộc tính/cột tương ứng trong DB của tôi là kiểu nối tiếp (yep postgres). Tôi cũng sẽ chỉ định kiểu số nguyên cho các trường id thực thể của tôi. Nhưng tôi đã thấy việc sử dụng Long getId() trên this page. Tôi cũng đã thấy loại kiểu này được gán cho các ví dụ về geomajas. Có bất kỳ dấu hiệu nào khi nói đến việc sử dụng Integer không? Tôi có nghĩa là, yeah bạn phải cẩn thận với số nguyên rằng id không phải là dưới 0 nhưng đồng thời bạn cũng phải chắc chắn rằng Long Id của bạn không phải là lớn hơn 2.147.483.647. Vì vậy, những gì đang đối phó ở đây?Dài so với Số nguyên cho trường id của các thực thể java

CHỈNH SỬA: Tôi đã nhầm lẫn giữa Long và số nguyên không dấu vì vậy tôi đoán những gì tôi đã nghĩ là "số nguyên không dấu so với Integer cho trường id của thực thể java", điều vô nghĩa là sự nhầm lẫn giữa số nguyên dài và không dấu là Không còn. Lỗi của tôi. Cảm ơn bạn đã trả lời và nhận xét của bạn. Tôi đoán nếu tôi đã có thể sử dụng máy phát điện thực thể bigserial jpa đã có thể sử dụng Long quá.

+1

"cẩn thận với số nguyên mà id không dưới 0" Tất cả các loại số java được ký. sự khác biệt giữa dài và số nguyên là phạm vi giá trị tối thiểu/tối đa. –

+1

Điểm sử dụng lâu dài rất có thể là thời gian dài có giá trị tối đa cao hơn nhiều so với '2,147,483,647' (9,223,372,036,854,775,807) trong trường hợp bạn có các bảng lớn. –

Trả lời

7

Long có công suất lớn hơn nhiều so với Integer kiểu dữ liệu, vì vậy nếu bạn không chắc chắn những gì chiều dài dữ liệu của bạn sẽ là, nó tốt hơn để được sử dụng Long kiểu dữ liệu ...

Mặt khác, kể từ Long có công suất lớn hơn nó sử dụng thêm không gian và nếu bạn chắc chắn rằng dữ liệu của bạn sẽ không được lớn hơn các loại Integer dữ liệu sau đó sử dụng Long chỉ làm cho mã của bạn không hiệu quả

7

JPA phát thực thể gán Integer loại đến các trường id của các thực thể của tôi

Bạn đặt loại trường id, trình tạo JPA sẽ điền vào nó với các giá trị duy nhất. Bạn được tự do sử dụng Integer hoặc Long.

Có bất kỳ dấu hiệu nào khi nói đến việc sử dụng Số nguyên không?

Không thực sự, sự khác biệt duy nhất giữa Integer & Long là số bit (64 câu 32) và phạm vi permissable:

Integer:    -2,147,483,648 to 2,147,483,647 
Long: -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 

Các máy phát điện sẽ gán giá trị cho các lĩnh vực Id. Bạn có thể kiểm soát giá trị được tạo ban đầu: cho @SequenceGenerator và @TableGenerator, đặt thuộc tính initialValue; cho bộ tạo danh tính, sửa đổi định nghĩa DDL cơ sở dữ liệu cho cột Identity.

Chỉ cần xác định (số Id tối đa được tạo mỗi tuần theo ứng dụng của bạn) x (số tuần tối đa mà ứng dụng của bạn có thể "hoạt động"). Nếu kết quả là ít hơn, nói, 1.500.000.000 (cho một lề an toàn), cảm thấy tự do để sử dụng Integer; nếu không thì dùng Long.

+0

Tôi đã nói tôi đã thực hiện một confuson nhưng tôi vẫn vui mừng bạn đăng này, nó khá thú vị – osh

0

'Gotcha' lớn nhất là khi bạn truy vấn một thực thể, bạn cần phải sử dụng LOẠI CHÍNH XÁC, hoặc việc triển khai thực hiện với ném một ngoại lệ. Và đây là một ngoại lệ RUNTIME.

entityManager.find(MyClass.class, intVal); // fails if type is long 
entityManager.find(MyClass.class, longVal); // fails if type is integer 

Tôi làm cho trường hợp để bảo trì, nhất quán giữa các thực thể của bạn cũng quan trọng như mọi cân nhắc về bộ nhớ.

Để tiếp tục đối số này, hãy xem xét rằng 'kích thước' không ảnh hưởng đến các gói đến/từ cơ sở dữ liệu.