Datatyper som stöds
Under de tre föregående nivåerna blev vi lite bekanta med Hibernate. Det är dags för andra omgången. Nu ska vi börja studera samma sak, bara djupare. Och vi börjar med att mappa fälten i klassen Entity till kolumnerna i tabellerna i databasen.
Som du redan vet, mappning av ett fält i en Entity-klass till en kolumn görs med @Column- kommentaren . Och nu är frågan: vilka typer av fält kan kartläggas med en sådan anteckning?
Alla datatyper i Java kan delas in i tre grupper:
- Typen är ganska enkel och lätt att lagra i en databas .
- Typen är komplex och du måste skriva en speciell omvandlare för den .
- Typen är mycket komplex och behöver en separat tabell för att lagra sina värden .
Enkla typer som Hibernate vet hur man lagrar inkluderar:
Typer i Java | paket | Klassexempel |
---|---|---|
Primitiva Java-typer | boolean , int , double , etc. | |
Omslag över primitiver | java.lang | Boolean , Heltal , Double , etc. |
Strängar | java.lang | Sträng |
"Avancerade" nummer | java.math | BigInteger och BigDecimal |
datum och tid | java.tid | LocalDate , LocalTime , LocalDateTime , OffsetTime , OffsetDateTime , Instant |
Olika datum- och tidsvariationer | java.util | datum och kalender |
Gamla datum- och tidsformat | java.sql | Datum , tid , tidsstämpel |
Array av byte eller tecken | byte[] eller Byte[] , char[] eller Character[] | |
Enums | Vilken uppräkning som helst | |
Serialiserbara objekt | Alla implementeringar av java.io.Serializable |
Alla dessa typer har sina motsvarigheter i SQL-språket, så Hibernate vet hur man lagrar och laddar dem från databasen.
Exempel:
@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;
}
Manuella typtilldelningar - @Typanteckning
Ibland kanske du vill manipulera Hibernates policy och uttryckligen tala om för den vilken typ av data som ska lagras i databasen. Till exempel har du ett fält i din Entity-klass av typen Integer, men i basen finns en kolumn för det med typen VARCHAR.
Det finns en speciell kommentar för detta - @Typ . Det ser väldigt enkelt ut:
@Type(type="type-name")
Låt oss till exempel be Hibernate att göra fältetSkapat Datumav vår användarklass lagrades i databasen som en sträng :
@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;
}
Om Hibernate kom på hur man konverterar datumtypen till din nya typ, så skulle det bara göra det. Om det inte förstår, måste du ange en speciell typ av omvandlare. Men mer om det senare.
Lista över vilolägestyper för databaser
Förresten, märkte du att vi angav typen org.hibernate.type.StringType , inte String . Detta beror på att vi har valt en av de typer som stöds av DBMS och inte av Java-språket. De har var sitt typsystem. Det är bara det att Hibernate-utvecklarna kom på bekväma namn i Java-stil istället för dessa VARCHAR.
Förresten, den här listan är inte så liten. Jag ger en del av det här:
Hibernate-typ (org.hibernate.type-paket) | JDBC typ | Java typ | BasicTypeRegistry-nyckel(ar) |
---|---|---|---|
StringType | VARCHAR | java.lang.string | sträng, java.lang.sträng |
materialiserad klump | CLOB | java.lang.string | materialized_clob |
texttyp | LONGVARCHAR | java.lang.string | text |
teckentyp | RÖDING | char, java.lang.Character | char, java.lang.Character |
BooleanType | bit | boolean, java.lang.Boolean | boolean, java.lang.Boolean |
NumericBooleanType | HELTAL, 0 är falskt, 1 är sant | boolean, java.lang.Boolean | numeric_boolean |
YesNoType | CHAR, 'N'/'n' är falskt, 'Y'/'y' är sant. Det stora värdet skrivs till databasen. | boolean, java.lang.Boolean | Ja Nej |
TrueFalseType | CHAR, 'F'/'f' är falskt, 'T'/'t' är sant. Det stora värdet skrivs till databasen. | boolean, java.lang.Boolean | sant falskt |
ByteType | TINYINT | byte, java.lang.Byte | byte, java.lang.Byte |
kort typ | SMALLINT | kort, java.lang.Short | kort, java.lang.Short |
IntegerTypes | HELTAL | int, java.lang.Integer | int, java.lang.Integer |
lång typ | STORT | lång, java.lang.Lång | lång, java.lang.Lång |
flyttyp | FLYTA | flyta, java.lang.Flyta | flyta, java.lang.Flyta |
dubbel typ | DUBBEL | dubbel, java.lang.Double | dubbel, java.lang.Double |
BigIntegerType | NUMERISK | java.math.BigInteger | big_integer, java.math.BigInteger |
BigDecimalType | NUMERISK | java.math.BigDecimal | big_decimal, java.math.bigDecimal |
TimestampType | TIDSSTÄMPEL | java.sql.timestamp | tidsstämpel, java.sql.tidsstämpel |
Tidstyp | TID | java.sql.Time | tid, java.sql.Time |
datumtyp | DATUM | java.sql.date | datum, java.sql.datum |
CalendarType | TIDSSTÄMPEL | java.util.Calendar | calendar, java.util.Calendar |
CalendarDateType | DATUM | java.util.Calendar | kalender_datum |
Valutatyp | java.util.Currency | VARCHAR | valuta, java.util.valuta |
LocaleType | VARCHAR | java.util.locale | locale, java.utility.locale |
TimeZoneType | VARCHAR, med TimeZone ID | java.util.TimeZone | tidszon, java.util.TimeZone |
UrlType | VARCHAR | java.net.URL | url, java.net.URL |
klasstyp | VARCHAR(klass FQN) | java.lang.Class | klass, java.lang.Klass |
Bordet är naturligtvis stort, men väldigt användbart. Till exempel framgår det tydligt av den att den booleska typen kan lagras i databasen på minst sex olika sätt. Behöver du inte så mycket? Och vem har sagt att du väljer sättet att spara på?
Det finns ingen boolesk typ i SQL och den lagras ofta så här:
- 1 eller 0
- "F" eller "T"
- "Y" eller "N"
Därför är det väldigt bra när Hibernate förstår alla dessa problem. Eller, till exempel, låt oss ta lagringen av datamatriser i databasen. Det finns ett gäng olika alternativ, och Hibernate vet hur man arbetar med dem alla:
Hibernate-typ (org.hibernate.type-paket) | JDBC typ | Java typ | BasicTypeRegistr |
---|---|---|---|
blob typ | KLICK | java.sql.blob | blogg, java.sql.blob |
clobtyp | CLOB | java.sql.clob | clob, java.sql.clob |
BinaryType | VARBINÄR | byte[] | binär, byte[] |
MaterializedBlobType | KLICK | byte[] | materized_blob |
Bildtyp | LÅNGVARBINÄRT | byte[] | bild |
WrapperBinaryType | VARBINÄR | java.lang.Byte[] | wrapper-binary, Byte[], java.lang.Byte[] |
CharArrayType | VARCHAR | röding[] | tecken, char[] |
CharacterArrayType | VARCHAR | java.lang.Character[] | wrapper-tecken, Character[], java.lang.Character[] |
UUIDBinaryType | BINÄR | java.util.UUID | uuid-binär, java.util.UUID |
UUIDCarType | CHAR, kan även läsa VARCHAR | java.util.UUID | uuid-char |
PostgreSQLUUIDType | PostgreSQL UUID, genom Types#OTHER, som överensstämmer med PostgreSQL JDBC-drivrutinsdefinitionen | java.util.UUID | pg-uuid |
Hibernate-typ (org.hibernate.type-paket) | JDBC typ | Java typ | BasicTypeRegistr |
---|---|---|---|
DurationType | STORT | java.time.Duration | Duration, java.time.Duration |
omedelbar typ | TIDSSTÄMPEL | java.time.Instant | Instant, java.time.Instant |
LocalDateTimeType | TIDSSTÄMPEL | java.time.LocalDateTime | LocalDateTime, java.time.LocalDateTime |
LocalDateType | DATUM | java.time.LocalDate | LocalDate, java.time.LocalDate |
LocalTimeType | TID | java.time.LocalTime | LocalTime, java.time.LocalTime |
OffsetDateTimeType | TIDSSTÄMPEL | java.time.OffsetDateTime | OffsetDateTime, java.time.OffsetDateTime |
OffsetTimeType | TID | java.time.OffsetTime | OffsetTime, java.time.OffsetTime |
OffsetTimeType | TIDSSTÄMPEL | java.time.ZonedDateTime | ZonedDateTime, java.time.ZonedDateTime |
GO TO FULL VERSION