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 |
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 |
GO TO FULL VERSION