Støttede datatyper
I løpet av de tre foregående nivåene ble vi litt kjent med Hibernate. Det er tid for andre runde. Nå skal vi begynne å studere det samme, bare dypere. Og vi starter med å kartlegge feltene i Entity-klassen til kolonnene i tabellene i databasen.
Som du allerede vet, tilordnes et felt i en Entity-klasse til en kolonne ved å bruke @Column- kommentaren . Og nå er spørsmålet: hvilke typer felt kan kartlegges med en slik merknad?
Alle datatyper i Java kan deles inn i tre grupper:
- Typen er ganske enkel og lett å lagre i en database .
- Typen er kompleks og du må skrive en spesiell omformer for den .
- Typen er veldig kompleks og trenger en egen tabell for å lagre verdiene .
Enkle typer som Hibernate vet hvordan de skal lagre inkluderer:
Skriver i Java | pakke | Klasseeksempler |
---|---|---|
Primitive Java-typer | boolsk , int , dobbel , etc. | |
Omslag over primitiver | java.lang | Boolsk , heltall , dobbel , etc. |
Strenger | java.lang | String |
"Avanserte" tall | java.math | BigInteger og BigDecimal |
dato og tid | java.tid | LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant |
Ulike dato- og klokkeslettvariasjoner | java.util | dato og kalender |
Gamle dato- og klokkeslettformater | java.sql | Dato , klokkeslett , tidsstempel |
En rekke byte eller tegn | byte[] eller Byte[] , char[] eller Character[] | |
Enums | Enhver oppregning | |
Serialiserbare objekter | Enhver implementering av java.io.Serializable |
Alle disse typene har sine motstykker i SQL-språket, så Hibernate vet hvordan de skal lagres og lastes fra databasen.
Eksempel:
@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;
}
Manuelle typetilordninger - @Typekommentar
Noen ganger vil du kanskje tukle med Hibernates policy og eksplisitt fortelle den hvilken type data skal lagres i databasen. For eksempel har du et felt i Entity-klassen din av typen Integer, men i basen er det en kolonne for det med typen VARCHAR.
Det er en spesiell merknad for dette - @Type . Det ser veldig enkelt ut:
@Type(type="type-name")
La oss for eksempel be Hibernate om å lage feltetopprettet datoav brukerklassen vår ble lagret i databasen som en streng :
@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;
}
Hvis Hibernate fant ut hvordan du konverterer datotypen til den nye typen, ville det bare gjøre det. Hvis den ikke forstår, må du spesifisere en spesiell type omformer. Men mer om det senere.
Liste over dvalemodus-typer for databaser
La du forresten merke til at vi spesifiserte typen org.hibernate.type.StringType , ikke String . Dette er fordi vi har valgt en av typene som støttes av DBMS og ikke av Java-språket. De har hvert sitt typesystem. Det er bare at Hibernate-utviklerne kom opp med praktiske navn i Java-stil i stedet for disse VARCHAR-ene.
Denne listen er forresten ikke så liten. Jeg vil gi en del av det her:
Hibernate type (org.hibernate.type-pakke) | JDBC type | Java-type | BasicTypeRegistry-nøkkel(er) |
---|---|---|---|
StringType | VARCHAR | java.lang.string | streng, java.lang.streng |
materialisert klob | CLOB | java.lang.string | materialized_clob |
teksttype | LONGVARCHAR | java.lang.string | tekst |
tegntype | CHAR | char, java.lang.Character | char, java.lang.Character |
BooleanType | bit | boolsk, java.lang.boolsk | boolsk, java.lang.boolsk |
NumericBooleanType | HELTAL, 0 er usant, 1 er sant | boolsk, java.lang.boolsk | numeric_boolean |
YesNoType | CHAR, 'N'/'n' er usant, 'Y'/'y' er sant. Den store verdien skrives til databasen. | boolsk, java.lang.boolsk | Ja Nei |
TrueFalseType | CHAR, 'F'/'f' er usant, 'T'/'t' er sant. Den store verdien skrives til databasen. | boolsk, java.lang.boolsk | true_false |
ByteType | TINYINT | byte, java.lang.Byte | byte, java.lang.Byte |
kort type | SMALLINT | kort, java.lang.Short | kort, java.lang.Short |
IntegerTypes | HELTAL | int, java.lang.Integer | int, java.lang.Integer |
lang type | STORT | lang, java.lang.Lang | lang, java.lang.Lang |
flytetype | FLYTE | flyte, java.lang.Flyte | flyte, java.lang.Flyte |
dobbel type | DOBBELT | dobbel, java.lang.Dobbel | dobbel, java.lang.Dobbel |
BigIntegerType | NUMERISK | java.math.BigInteger | big_integer, java.math.BigInteger |
BigDecimalType | NUMERISK | java.math.BigDecimal | big_decimal, java.math.bigDecimal |
TimestampType | TIDSSTIMPEL | java.sql.tidsstempel | tidsstempel, java.sql.tidsstempel |
Tidstype | TID | java.sql.Time | tid, java.sql.Time |
datotype | DATO | java.sql.date | dato, java.sql.dato |
Kalendertype | TIDSSTIMPEL | java.util.Calendar | kalender, java.util.Calendar |
CalendarDateType | DATO | java.util.Calendar | kalender_dato |
CurrencyType | java.util.Currency | VARCHAR | valuta, java.util.Valuta |
LocaleType | VARCHAR | java.util.locale | locale, java.utility.locale |
TimeZoneType | VARCHAR, ved å bruke TimeZone ID | java.util.TimeZone | tidssone, java.util.TimeZone |
UrlType | VARCHAR | java.net.URL | url, java.net.URL |
klassetype | VARCHAR(klasse FQN) | java.lang.Klasse | klasse, java.lang.Klasse |
Bordet er selvfølgelig stort, men veldig nyttig. For eksempel er det klart av den at den boolske typen kan lagres i databasen på minst seks forskjellige måter. Trenger du ikke så mye? Og hvem sa at du velger måten å spare på?
Det er ingen boolsk type i SQL, og den lagres ofte slik:
- 1 eller 0
- "F" eller "T"
- "Y" eller "N"
Derfor er det veldig bra når Hibernate forstår alle disse problemene. Eller, for eksempel, la oss ta lagringen av datamatriser i databasen. Det er en haug med forskjellige alternativer, og Hibernate vet hvordan man jobber med dem alle:
Hibernate type (org.hibernate.type-pakke) | JDBC type | Java-type | BasicTypeRegistr |
---|---|---|---|
blob type | BLOB | java.sql.blob | blogg, java.sql.blob |
clobtype | CLOB | java.sql.clob | clob, java.sql.clob |
BinaryType | VARBINARY | byte[] | binær, byte[] |
Materialisert BlobType | BLOB | byte[] | materisert_blob |
Bildetype | LANGVARBINÆR | byte[] | bilde |
WrapperBinaryType | VARBINARY | java.lang.Byte[] | wrapper-binary, Byte[], java.lang.Byte[] |
CharArrayType | VARCHAR | røye[] | tegn, tegn[] |
CharacterArrayType | VARCHAR | java.lang.Character[] | wrapper-characters, Character[], java.lang.Character[] |
UUIDBinaryType | BINÆR | java.util.UUID | uuid-binær, java.util.UUID |
UUIDCarType | CHAR, kan også lese VARCHAR | java.util.UUID | uuid-char |
PostgreSQLUUIDType | PostgreSQL UUID, gjennom Types#OTHER, som samsvarer med PostgreSQL JDBC-driverdefinisjonen | java.util.UUID | pg-uuid |
Hibernate type (org.hibernate.type-pakke) | JDBC type | Java-type | BasicTypeRegistr |
---|---|---|---|
DurationType | STORT | java.time.Varighet | Varighet, java.time.Duration |
øyeblikkelig type | TIDSSTIMPEL | java.time.Instant | Instant, java.time.Instant |
LocalDateTimeType | TIDSSTIMPEL | java.time.LocalDateTime | LocalDateTime, java.time.LocalDateTime |
LocalDateType | DATO | java.time.LocalDate | LocalDate, java.time.LocalDate |
LocalTimeType | TID | java.time.LocalTime | LocalTime, java.time.LocalTime |
OffsetDateTimeType | TIDSSTIMPEL | java.time.OffsetDateTime | OffsetDateTime, java.time.OffsetDateTime |
OffsetTimeType | TID | java.time.OffsetTime | OffsetTime, java.time.OffsetTime |
OffsetTimeType | TIDSSTIMPEL | java.time.ZonedDateTime | ZonedDateTime, java.time.ZonedDateTime |
GO TO FULL VERSION