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
A od czasu wydania JDK 8, Hibernate dodał jeszcze kilka typów związanych z czasem. Wszystko po to, aby ułatwić Ci życie. Nie musisz się już zastanawiać, czy wszystkie te nowomodne typy są obsługiwane. Twórcy Hibernate już dodali dla Ciebie wsparcie:
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