Ondersteunde gegevenstypen

Tijdens de vorige drie niveaus raakten we een beetje vertrouwd met Hibernate. Het is tijd voor de tweede ronde. Nu zullen we hetzelfde gaan bestuderen, alleen dieper. En we beginnen met het toewijzen van de velden van de klasse Entity aan de kolommen van de tabellen in de database.

Zoals u al weet, wordt het toewijzen van een veld in een Entity-klasse aan een kolom gedaan met behulp van de @Column- annotatie . En nu is de vraag: wat voor soort velden kunnen met zo'n annotatie in kaart worden gebracht?

Alle gegevenstypen in Java kunnen in drie groepen worden verdeeld:

  • Het type is vrij eenvoudig en gemakkelijk op te slaan in een database .
  • Het type is complex en je moet er een speciale converter voor schrijven .
  • Het type is zeer complex en heeft een aparte tabel nodig om de waarden op te slaan .

Eenvoudige typen die Hibernate weet op te slaan, zijn onder meer:

Typ Java pakket Klasse voorbeelden
Primitieve Java-typen boolean , int , double , enz.
Wrappers over primitieven java lang Booleaans , geheel getal , dubbel , enz.
Snaren java lang Snaar
"Geavanceerde" nummers java.wiskunde BigInteger en BigDecimal
datum en tijd java.tijd LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant
Diverse datum- en tijdvariaties java.util datum en kalender
Oude datum- en tijdnotaties java.sql Datum , tijd , tijdstempel
Array van bytes of karakters byte[] of Byte[] , char[] of Character[]
Opsommingen Elke opsomming
Serialiseerbare objecten Elke implementatie van java.io.Serializable

Al deze typen hebben hun tegenhangers in de SQL-taal, dus Hibernate weet hoe ze moeten worden opgeslagen en geladen vanuit de database.

Voorbeeld:

@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;
}

Handmatige typetoewijzingen - @Type-annotatie

Soms wilt u misschien knoeien met het beleid van Hibernate en expliciet vertellen welk type gegevens in de database moet worden opgeslagen. U hebt bijvoorbeeld een veld in uw Entity-klasse van het type Integer, maar in de basis is er een kolom voor met het type VARCHAR.

Hiervoor is een speciale annotatie - @Type . Het ziet er heel eenvoudig uit:

@Type(type="type-name")

Laten we bijvoorbeeld Hibernate vragen om het veld te makenaangemaaktDatumvan onze gebruikersklasse is opgeslagen in de database als een 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;
}

Als Hibernate erachter kwam hoe het datumtype naar uw nieuwe type kon worden geconverteerd, dan zou het het gewoon doen. Als het het niet begrijpt, moet u een speciaal type converter specificeren. Maar daarover later meer.

Lijst met slaapstandtypen voor databases

Is het je trouwens opgevallen dat we het type org.hibernate.type.StringType hebben gespecificeerd , niet String . Dit komt omdat we een van de typen hebben gekozen die worden ondersteund door het DBMS en niet door de Java-taal. Ze hebben elk hun eigen typesysteem. Het is alleen dat de Hibernate-ontwikkelaars handige namen in Java-stijl bedachten in plaats van deze VARCHAR's.

Overigens is deze lijst niet zo klein. Ik geef hier een deel ervan:

Slaapstandtype (org.hibernate.type pakket) JDBC-type Java-type BasicTypeRegistersleutel(s)
Tekenreekstype VARCHAR java.lang.string string, java.lang.string
gematerialiseerde klomp KLOB java.lang.string gematerialiseerde_clob
bericht soort LANGVARCHAR java.lang.string tekst
karaktertype CHAR char, java.lang.Character char, java.lang.Character
Booleaans type beetje boolean, java.lang.Boolean boolean, java.lang.Boolean
NumeriekBooleanType INTEGER, 0 is onwaar, 1 is waar boolean, java.lang.Boolean numeriek_booleaans
JaNeeType CHAR, 'N'/'n' is onwaar, 'Y'/'y' is waar. De waarde in hoofdletters wordt naar de database geschreven. boolean, java.lang.Boolean Ja nee
TrueFalseType CHAR, 'F'/'f' is onwaar, 'T'/'t' is waar. De waarde in hoofdletters wordt naar de database geschreven. boolean, java.lang.Boolean waar onwaar
ByteType KLEINEINT byte, java.lang.Byte byte, java.lang.Byte
korte soort KLEININT kort, java.lang.Short kort, java.lang.Short
IntegerTypen GEHEEL GETAL int, java.lang.Integer int, java.lang.Integer
lange soort BIGINT long, java.lang.Long long, java.lang.Long
vlotter type VLOT float, java.lang.Float float, java.lang.Float
dubbele soort DUBBELE double, java.lang.Double double, java.lang.Double
BigIntegerType NUMERIEK java.math.BigInteger big_integer, java.math.BigInteger
BigDecimalType NUMERIEK java.math.BigDecimal big_decimal, java.math.bigDecimal
TijdstempelType TIJDSTAMP java.sql.tijdstempel tijdstempel, java.sql.tijdstempel
Type tijd TIJD java.sql.Tijd tijd, java.sql.Tijd
datumsoort DATUM java.sql.datum datum, java.sql.datum
KalenderType TIJDSTAMP java.util.Kalender kalender, java.util.Calendar
KalenderDatumType DATUM java.util.Kalender kalender_datum
Valuta type java.util.Valuta VARCHAR currency, java.util.Currency
LocaleType VARCHAR java.util.locale locale, java.utility.locale
TijdZoneType VARCHAR, met behulp van de TimeZone-ID java.util.TimeZone timezone, java.util.TimeZone
UrlType VARCHAR java.net.URL url, java.net.URL
klasse type VARCHAR(klasse FQN) java.lang.Class class, java.lang.Class

De tafel is natuurlijk groot, maar erg handig. Hieruit blijkt bijvoorbeeld dat het Booleaanse type op maar liefst zes verschillende manieren in de database kan worden opgeslagen. Heb je niet zoveel nodig? En wie zei dat je de manier kiest om te sparen?

Er is geen Booleaans type in SQL en het wordt vaak als volgt opgeslagen:

  • 1 of 0
  • 'F' of 'T'
  • 'J' of 'N'

Daarom is het erg goed als Hibernate al deze problemen begrijpt. Of nemen we bijvoorbeeld de opslag van data-arrays in de database. Er zijn een heleboel verschillende opties en Hibernate weet met ze allemaal te werken:

Slaapstandtype (org.hibernate.type pakket) JDBC-type Java-type BasicTypeRegistr
blob-type BLOB java.sql.blob blog, java.sql.blob
klomptype KLOB java.sql.clob clob, java.sql.clob
Binair type VARBINARY byte[] binair, byte[]
GematerialiseerdBlobType BLOB byte[] gematteriseerde_blob
Beeldtype LONGVARBINARY byte[] afbeelding
WrapperBinairType VARBINARY java.lang.Byte[] wrapper-binair, Byte[], java.lang.Byte[]
CharArrayType VARCHAR char[] karakters, char[]
CharacterArrayType VARCHAR java.lang.Karakter[] wrapper-karakters, Karakter[], java.lang.Character[]
UUIDBinaryType BINAIR java.util.UUID uuid-binary, java.util.UUID
UUIDCharType CHAR, kan ook VARCHAR lezen java.util.UUID uuid-char
PostgreSQLUUIDType PostgreSQL UUID, via Types#OTHER, die voldoet aan de definitie van het PostgreSQL JDBC-stuurprogramma java.util.UUID pg-uuid
En sinds de release van JDK 8 heeft Hibernate nog een paar tijdgerelateerde typen toegevoegd. Alles om uw leven makkelijker te maken. Je hoeft je niet meer af te vragen of al deze nieuwerwetse types worden ondersteund. De makers van Hibernate hebben hun ondersteuning al voor je toegevoegd:
Slaapstandtype (org.hibernate.type pakket) JDBC-type Java-type BasicTypeRegistr
DuurType BIGINT java.tijd.Duur Duur, java.tijd.Duur
instant soort TIJDSTAMP java.time.Instant Instant, java.time.Instant
LocalDateTimeType TIJDSTAMP java.time.LocalDateTime LocalDateTime, java.time.LocalDateTime
LocalDateType DATUM java.time.LocalDate LocalDate, java.time.LocalDate
LocalTimeType TIJD java.tijd.LocalTime LocalTime, java.time.LocalTime
OffsetDateTimeType TIJDSTAMP java.time.OffsetDateTime OffsetDateTime, java.time.OffsetDateTime
OffsetTimeType TIJD java.time.OffsetTime OffsetTime, java.time.OffsetTime
OffsetTimeType TIJDSTAMP java.time.ZonedDateTime ZonedDateTime, java.time.ZonedDateTime