2013-07-01 12 views
8

Generator jednostek Jpa przypisuje typ Integer do pól id moich jednostek. Odpowiedni atrybut/kolumna w moim DB jest typu serial (tak postgres). Przypisałbym również typ całkowity do pól id moich jednostek. Ale widziałem użycie Long getId() na this page. Widziałem również tego typu przypisywanie typów na przykładach geomajas. Czy jest jakiś błąd w używaniu Integer? Chodzi mi o to, że musisz uważać z liczbą całkowitą, że id nie jest poniżej 0, ale jednocześnie musisz się upewnić, że twój Long Id nie jest większy niż 2 147 483 647. O co tu chodzi?Długi versus Integer dla pola id jednostek java

EDIT: I robił pomylenie Long i liczba całkowita bez znaku, więc myślę, co mam na myśli to „liczba całkowita bez znaku kontra Integer dla pola id podmiotów Java”, który jest nonsens teraz, że moje pomieszanie między długim i liczba całkowita bez znaku jest odszedł. Mój błąd. Dziękuję za odpowiedzi i komentarze. Chyba bym użył bigserialowego generatora jednostek jpa, użyłbym też Longa.

+1

"ostrożnie z liczbą całkowitą, której identyfikator nie jest niższy niż 0" Wszystkie typy liczbowe java są podpisane. różnica między długością a liczbą całkowitą to zakres wartości min/maks. –

+1

Punktem, w którym można użyć długiego, najprawdopodobniej jest to, że długa ma wartość maksymalną, która jest znacznie wyższa niż "2 147 483 647" (9 223 372 036 854 775 807) w przypadku dużych tabel. –

Odpowiedz

7

Long ma znacznie większą pojemność niż Integer typu danych, więc jeśli nie jesteś pewien, co długość dane będzie, że lepiej być przy użyciu typu danych Long ...

Z drugiej strony, od Long ma większy potencjał wykorzystuje dodatkową przestrzeń, a jeśli jesteś pewien, że twoje dane nie będą większe niż typu Integer danych a następnie za pomocą Long właśnie sprawia, że ​​kod nieefektywne

7

JPA generator jednostka przyporządkowuje typ Integer do pól id moich jednostek

Ustaw typ pola identyfikatora, generator JPA wypełnia go unikalnymi wartościami. Możesz używać Integer lub Long.

Czy jest jakiś błąd, jeśli chodzi o używanie Integer?

Nie naprawdę, jedyną różnicą między Integer & długo liczbę bitów (64 V 32) i dopuszczalna gama:

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 

Generator będzie przypisanie wartości do pola ID. Możesz kontrolować początkową wygenerowaną wartość: dla @SequenceGenerator i @TableGenerator, ustaw atrybut initialValue; dla generatora tożsamości, zmodyfikuj definicję bazy danych DDL dla kolumny Tożsamość.

Po prostu określ (maksymalna liczba identyfikatorów wygenerowanych tygodniowo przez aplikację) x (maksymalna liczba tygodni, przez którą aplikacja może być "na żywo"). Jeśli wynik jest mniejszy niż, powiedzmy, 1 500 000 000 (dający margines bezpieczeństwa), możesz użyć opcji Integer; w przeciwnym razie użyj Long.

+0

Powiedziałem już, że zrobiłem confuson, ale wciąż cieszę się, że to napisałeś, jest całkiem interesujące – osh

0

Największą "gotcha" jest to, że gdy szukasz jednostki, musisz użyć typu szczegółowego lub implementacji z wyrzuceniem wyjątku. A to jest wyjątek RUNTIME.

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

Podkreślam, że ze względu na łatwość konserwacji spójność między waszymi jednostkami jest tak samo ważna, jak każda uwaga.

Aby zwiększyć ten argument, należy wziąć pod uwagę, że "rozmiar" nie wpływa na pakiety do/z bazy danych.