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