Understøttede datatyper
I løbet af de foregående tre niveauer blev vi lidt fortrolige med Hibernate. Det er tid til anden runde. Nu vil vi begynde at studere det samme, kun dybere. Og vi starter med at kortlægge felterne i Entity-klassen til kolonnerne i tabellerne i databasen.
Som du allerede ved, tilknyttes et felt i en Entity-klasse til en kolonne ved hjælp af @Column- annotationen . Og nu er spørgsmålet: hvilke typer felter kan kortlægges med sådan en annotering?
Alle datatyper i Java kan opdeles i tre grupper:
- Typen er ret enkel og nem at gemme i en database .
- Typen er kompleks, og du skal skrive en speciel konverter til den .
- Typen er meget kompleks og har brug for en separat tabel for at gemme dens værdier .
Simple typer, som Hibernate ved, hvordan man opbevarer, omfatter:
Typer i Java | pakke | Klasseeksempler |
---|---|---|
Primitive Java-typer | boolean , int , double osv. | |
Indpakning over primitiver | java.lang | Boolean , heltal , dobbelt osv. |
Strenge | java.lang | Snor |
"Avancerede" numre | java.math | BigInteger og BigDecimal |
dato og tid | java.tid | LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant |
Forskellige dato og klokkeslæt variationer | java.util | dato og kalender |
Gamle dato- og tidsformater | java.sql | Dato , Tid , Tidsstempel |
Array af bytes eller tegn | byte[] eller Byte[] , char[] eller Character[] | |
Enums | Enhver opregning | |
Serialiserbare objekter | Enhver implementering af java.io.Serializable |
Alle disse typer har deres modstykker i SQL-sproget, så Hibernate ved, hvordan man gemmer og indlæser dem 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 typetildelinger - @Typeanmærkning
Nogle gange vil du måske manipulere med Hibernates politik og udtrykkeligt fortælle den, hvilken type data skal lagres i databasen. For eksempel har du et felt i din Entity-klasse af typen Integer, men i basen er der en kolonne for det med typen VARCHAR.
Der er en særlig anmærkning til dette - @Type . Det ser meget simpelt ud:
@Type(type="type-name")
Lad os for eksempel bede Hibernate om at lave feltetoprettet datoaf vores brugerklasse blev gemt 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 fandt ud af, hvordan man konverterer datotypen til din nye type, så ville den bare gøre det. Hvis det ikke forstår det, bliver du nødt til at angive en speciel type konverter. Men mere om det senere.
Liste over dvaletyper til databaser
Forresten, lagde du mærke til, at vi specificerede typen org.hibernate.type.StringType , ikke String . Dette skyldes, at vi har valgt en af de typer, der understøttes af DBMS og ikke af Java-sproget. De har hver deres typesystem. Det er bare, at Hibernate-udviklerne fandt på praktiske navne i Java-stil i stedet for disse VARCHAR'er.
Denne liste er i øvrigt ikke så lille. Jeg giver en del af det her:
Hibernate-type (org.hibernate.type-pakke) | JDBC type | Java type | BasicTypeRegistry nøgle(r) |
---|---|---|---|
StringType | VARCHAR | java.lang.string | streng, java.lang.streng |
materialiseret klump | KLUB | java.lang.string | materialized_clob |
teksttype | LONGVARCHAR | java.lang.string | tekst |
tegntype | CHAR | char, java.lang.Karakter | char, java.lang.Karakter |
BooleanType | lidt | boolesk, java.lang.Boolean | boolesk, java.lang.Boolean |
NumericBooleanType | HELTAL, 0 er falsk, 1 er sand | boolesk, java.lang.Boolean | numerisk_boolesk |
YesNoType | CHAR, 'N'/'n' er falsk, 'Y'/'y' er sand. Den store værdi skrives til databasen. | boolesk, java.lang.Boolean | Ja Nej |
TrueFalseType | CHAR, 'F'/'f' er falsk, 'T'/'t' er sandt. Den store værdi skrives til databasen. | boolesk, java.lang.Boolean | sandt falsk |
ByteType | TINYINT | byte, java.lang.Byte | byte, java.lang.Byte |
kort type | SMALLINT | kort, java.lang.Short | kort, java.lang.Short |
Heltalstyper | HELTAL | int, java.lang.Integer | int, java.lang.Integer |
lang type | STORT | lang, java.lang.Lang | lang, java.lang.Lang |
flydetype | FLYDE | flyde, java.lang.Float | flyde, java.lang.Float |
dobbelt type | DOBBELT | dobbelt, java.lang.Dobbelt | dobbelt, java.lang.Dobbelt |
BigIntegerType | NUMERISK | java.math.BigInteger | big_integer, java.math.BigInteger |
BigDecimalType | NUMERISK | java.math.BigDecimal | big_decimal, java.math.bigDecimal |
TidsstempelType | TIDSSTEMPEL | 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 | TIDSSTEMPEL | 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 hjælp af TimeZone ID | java.util.TimeZone | tidszone, 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 meget anvendeligt. For eksempel fremgår det tydeligt af den, at den boolske type kan lagres i databasen på mindst seks forskellige måder. Har du ikke brug for så meget? Og hvem sagde, at du vælger måden at spare på?
Der er ingen boolsk type i SQL, og den er ofte gemt sådan:
- 1 eller 0
- 'F' eller 'T'
- 'Y' eller 'N'
Derfor er det meget godt, når Hibernate forstår alle disse problemer. Eller lad os for eksempel tage lagringen af dataarrays i databasen. Der er en masse forskellige muligheder, og Hibernate ved, hvordan man arbejder med dem alle:
Hibernate-type (org.hibernate.type-pakke) | JDBC type | Java type | BasicTypeRegistr |
---|---|---|---|
klat type | BLOB | java.sql.blob | blog, java.sql.blob |
clobtype | KLUB | java.sql.clob | clob, java.sql.clob |
BinærType | VARBINARY | byte[] | binær, byte[] |
Materialiseret BlobType | BLOB | byte[] | materized_blob |
Billedtype | LANGVARBINÆR | byte[] | billede |
WrapperBinaryType | VARBINARY | java.lang.Byte[] | wrapper-binær, Byte[], java.lang.Byte[] |
CharArrayType | VARCHAR | char[] | 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å læse VARCHAR | java.util.UUID | uuid-char |
PostgreSQLUUIDType | PostgreSQL UUID, gennem Types#OTHER, som overholder PostgreSQL JDBC-driverdefinitionen | java.util.UUID | pg-uuid |
Hibernate-type (org.hibernate.type-pakke) | JDBC type | Java type | BasicTypeRegistr |
---|---|---|---|
DurationType | STORT | java.time.Varighed | Varighed, java.time.Duration |
øjeblikkelig type | TIDSSTEMPEL | java.time.Instant | Øjeblikkelig, java.time.Instant |
LocalDateTimeType | TIDSSTEMPEL | 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 | TIDSSTEMPEL | java.time.OffsetDateTime | OffsetDateTime, java.time.OffsetDateTime |
OffsetTimeType | TID | java.time.OffsetTime | OffsetTime, java.time.OffsetTime |
OffsetTimeType | TIDSSTEMPEL | java.time.ZonedDateTime | ZonedDateTime, java.time.ZonedDateTime |
GO TO FULL VERSION