Obsługiwane typy danych
Podczas poprzednich trzech poziomów trochę zaznajomiliśmy się z Hibernacją. Pora na drugą rundę. Teraz zaczniemy studiować to samo, tylko głębiej. A zaczniemy od zmapowania pól klasy Entity na kolumny tabel w bazie danych.
Jak już wiesz, mapowanie pola w klasie Entity na kolumnę odbywa się za pomocą adnotacji @Column . I teraz pytanie: jakie typy pól można zmapować za pomocą takiej adnotacji?
Wszystkie typy danych w Javie można podzielić na trzy grupy:
- Typ jest dość prosty i łatwy do przechowywania w bazie danych .
- Typ jest złożony i musisz napisać dla niego specjalny konwerter .
- Typ jest bardzo złożony i wymaga oddzielnej tabeli do przechowywania jego wartości .
Proste typy, które Hibernate wie, jak przechowywać, obejmują:
Typy w Javie | pakiet | Przykłady zajęć |
---|---|---|
Prymitywne typy Javy | boolean , int , double , itd. | |
Opakowania nad prymitywami | java.lang | Boolean , Integer , Double , itp. |
Smyczki | java.lang | Strunowy |
Liczby „zaawansowane”. | java.math | BigInteger i BigDecimal |
Data i godzina | java.time | LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant |
Różne warianty daty i godziny | java.util | data i kalendarz |
Stare formaty daty i godziny | java.sql | Data , godzina , znacznik czasu |
Tablica bajtów lub znaków | byte[] lub Byte[] , char[] lub Character[] | |
wyliczenia | Dowolne wyliczenie | |
Obiekty serializowalne | Dowolna implementacja java.io.Serializable |
Wszystkie te typy mają swoje odpowiedniki w języku SQL, więc Hibernate wie, jak je przechowywać i ładować z bazy danych.
Przykład:
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Column(name="name")
public String name;
@Column(name="level")
public Integer level;
@Column(name="created_date")
public Date createdDate;
}
Ręczne przypisania typów — adnotacja @Type
Czasami możesz chcieć manipulować polityką Hibernate i wyraźnie powiedzieć, jakiego typu dane mają być przechowywane w bazie danych. Na przykład masz pole w swojej klasie Entity typu Integer, ale w bazie jest dla niego kolumna typu VARCHAR.
Jest do tego specjalna adnotacja - @Type . Wygląda to bardzo prosto:
@Type(type="type-name")
Poprośmy na przykład Hibernate o utworzenie polastworz Datenaszej klasy User został zapisany w bazie danych jako string:
@Entity
@Table(name="user")
class User
{
@Column(name="id")
public Integer id;
@Column(name="created_date")
@Type(type="org.hibernate.type.StringType")
public Date createdDate;
}
Gdyby Hibernate wymyślił, jak przekonwertować typ Date na nowy typ, po prostu by to zrobił. Jeśli nie rozumie, musisz określić specjalny konwerter typów. Ale o tym później.
Lista typów Hibernate dla baz danych
Przy okazji, czy zauważyłeś, że określiliśmy typ org.hibernate.type.StringType , a nie String . Dzieje się tak dlatego, że wybraliśmy jeden z typów obsługiwanych przez DBMS, a nie przez język Java. Każdy z nich ma swój własny system typów. Po prostu programiści Hibernate wymyślili wygodne nazwy w stylu Java zamiast tych VARCHAR.
Nawiasem mówiąc, ta lista nie jest taka mała. Część podam tutaj:
Typ Hibernate (pakiet org.hibernate.type) | typu JDBC | typ Javy | BasicTypeRegistry key(s) |
---|---|---|---|
Typ ciągu | VARCHAR | java.lang.string | string, java.lang.string |
zmaterializowany kłąb | KLOB | java.lang.string | zmaterializowany_klob |
typ tekstu | LONGVARCHAR | java.lang.string | tekst |
typ postaci | ZWĘGLAĆ | char, java.lang.Character | char, java.lang.Character |
Typ logiczny | fragment | boolean, java.lang.boolean | boolean, java.lang.boolean |
NumericBooleanTyp | INTEGER, 0 to fałsz, 1 to prawda | boolean, java.lang.boolean | numeric_boolean |
TakNieTyp | CHAR, „N”/„n” to fałsz, „Y”/„y” to prawda. Duża wartość jest zapisywana w bazie danych. | boolean, java.lang.boolean | tak nie |
Typ TrueFalse | ZNAK, „F”/„f” to fałsz, „T”/„t” to prawda. Duża wartość jest zapisywana w bazie danych. | boolean, java.lang.boolean | prawda fałsz |
Typ bajtu | MALUTKI | bajt, java.lang.Byte | bajt, java.lang.Byte |
krótki typ | MAŁE INT | krótki, java.lang.Short | krótki, java.lang.Short |
Typy liczb całkowitych | LICZBA CAŁKOWITA | int, java.lang.Integer | int, java.lang.Integer |
długi typ | DUŻE | długi, java.lang.Long | długi, java.lang.Long |
typ pływaka | PLATFORMA | float, java.lang.Float | float, java.lang.Float |
typ podwójny | PODWÓJNIE | podwójne, java.lang.Double | podwójne, java.lang.Double |
Typ dużej liczby całkowitej | LICZBOWE | java.math.BigInteger | big_integer, java.math.BigInteger |
Typ BigDecimal | LICZBOWE | java.math.BigDecimal | big_decimal, java.math.bigDecimal |
Typ znacznika czasu | ZNAK CZASU | znacznik czasu java.sql | znacznik czasu, java.sql.znacznik czasu |
Typ czasu | CZAS | java.sql.Time | czas, java.sql.czas |
typ daty | DATA | java.sql.data | data, java.sql.data |
Typ kalendarza | ZNAK CZASU | java.util.Calendar | kalendarz, java.util.Calendar |
Typ daty kalendarza | DATA | java.util.Calendar | data_kalendarzowa |
Rodzaj waluty | java.util.Waluta | VARCHAR | waluta, java.util.Currency |
Typ ustawień regionalnych | VARCHAR | java.util.locale | ustawienia regionalne, java.utility.locale |
Typ strefy czasowej | VARCHAR, używając identyfikatora strefy czasowej | java.util.Strefa czasowa | strefa czasowa, java.util.TimeZone |
Typ adresu URL | VARCHAR | java.net.URL | url, java.net.URL |
typ klasy | VARCHAR(klasa FQN) | java.lang.Klasa | klasa, java.lang.Klasa |
Stół jest oczywiście duży, ale bardzo przydatny. Na przykład jasno z niego wynika, że typ Boolean można przechowywać w bazie danych na co najmniej sześć różnych sposobów. Nie potrzebujesz aż tak dużo? A kto powiedział, że wybierasz sposób oszczędzania?
W SQL nie ma typu Boolean i często jest on przechowywany w następujący sposób:
- 1 lub 0
- „F” lub „T”
- „T” lub „N”
Dlatego bardzo dobrze, gdy Hibernate rozumie wszystkie te problemy. Lub, na przykład, weźmy przechowywanie tablic danych w bazie danych. Istnieje wiele różnych opcji, a Hibernate wie, jak z nimi wszystkimi pracować:
Typ Hibernate (pakiet org.hibernate.type) | typu JDBC | typ Javy | Rejestr typu podstawowego |
---|---|---|---|
typu blob | KROPELKA | java.sql.blob | blog, java.sql.blob |
typ klobu | KLOB | java.sql.clob | clob, java.sql.clob |
Typ binarny | WARBINARNE | bajt[] | binarny, bajt[] |
MaterializedBlobType | KROPELKA | bajt[] | materized_blob |
Typ obrazu | DŁUGIE WARBINARNE | bajt[] | obraz |
WrapperBinaryType | WARBINARNE | java.lang.Byte[] | wrapper-binary, Byte[], java.lang.Byte[] |
CharArrayTyp | VARCHAR | zwęglać[] | znaki, znak [] |
Typ tablicy znaków | VARCHAR | java.lang.Znak[] | znaki opakowujące, znak [], java.lang.Character [] |
UUIDBinaryType | DWÓJKOWY | java.util.UUID | uuid-binarny, java.util.UUID |
UUIDCharType | CHAR, może również czytać VARCHAR | java.util.UUID | uuid-char |
PostgreSQLUUIDTyp | PostgreSQL UUID, poprzez Types#OTHER, który jest zgodny z definicją sterownika PostgreSQL JDBC | java.util.UUID | pg-uuid |
Typ Hibernate (pakiet org.hibernate.type) | typu JDBC | typ Javy | Rejestr typu podstawowego |
---|---|---|---|
Typ czasu trwania | DUŻE | Java.czas.Czas trwania | Czas trwania, czas java. Czas trwania |
natychmiastowy typ | ZNAK CZASU | java.time.Instant | Natychmiastowa, java.time.Instant |
LocalDateTimeType | ZNAK CZASU | java.time.LocalDateTime | LocalDateTime, java.time.LocalDateTime |
LokalnyTypDaty | DATA | java.time.LocalDate | LocalDate, java.time.LocalDate |
Typ czasu lokalnego | CZAS | Java.czas.Lokalny czas | Czas lokalny, czas java. Czas lokalny |
Przesunięcie typu daty i godziny | ZNAK CZASU | java.time.OffsetDateTime | OffsetDateTime, java.time.OffsetDateTime |
Typ czasu przesunięcia | CZAS | java.time.OffsetTime | Czas przesunięcia, czas java. Czas przesunięcia |
Typ czasu przesunięcia | ZNAK CZASU | java.time.ZonedDateTime | ZonedDateTime, java.time.ZonedDateTime |
GO TO FULL VERSION