大物件屬性JPA對映
阿新 • • 發佈:2019-02-14
大物件型別的資料庫表字段
以MySQL為例,儲存字元資料的資料庫表字段型別一般選擇char,varchar,nchar,nvarchar。儲存二進位制資料的資料庫表字段型別一般選擇binary,varbinary。但是,這些型別儲存的資料長度非常有限。比如,我們需要儲存一篇長文章,一個大檔案,這些型別的欄位長度往往就不夠使用了。MySQL常用的大物件型別有兩個,分別是text和blob,分別儲存大字元資料,大二進位制資料。
欄位resume型別是longtext,儲存大字元資料。欄位headPortrait型別是longblob,儲存大二進位制資料。欄位height型別是decimal(4,2),表示整數位和小數位一共4位,其中小數位佔用2位,整數位佔用2位。如果小數位不足2位,用0填充。比如,1.2,儲存為2.20。如果整數位超出2位,比如178報出如下異常。CREATE TABLE `person` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, `resume` longtext, `headPortrait` longblob, `height` decimal(4,2) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB;
如果小數位超出2位,不會報出異常,而是使用四捨五入法,結果保留2位小數。比如15.236,儲存為15.27。Operation failed: There was an error while applying the SQL script to the database. Executing: UPDATE `entitymappings`.`person` SET `height`='178' WHERE `id`='1'; ERROR 1264: 1264: Out of range value for column 'height' at row 1 SQL Statement: UPDATE `entitymappings`.`person` SET `height`='178' WHERE `id`='1'
實體類
註解javax.persistence.Lob,如果屬性的型別是String、char[],則被對映成資料庫欄位的text型別,比如longtext。如果屬性的型別是byte[]、Serializable,則被對映成資料庫欄位的blob型別,比如longblob。package com.gxz.entities; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Lob; import javax.persistence.Table; @Entity @Table public class Person { private long id; private String resume; private byte[] headPortrait; private double height; private String name; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public long getId() { return id; } public void setId(long id) { this.id = id; } @Lob public String getResume() { return resume; } public void setResume(String resume) { this.resume = resume; } @Lob public byte[] getHeadPortrait() { return headPortrait; } public void setHeadPortrait(byte[] headPortrait) { this.headPortrait = headPortrait; } public double getHeight() { return height; } public void setHeight(double height) { this.height = height; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
持久化
Person person = new Person();
person.setName("張三");
person.setHeight(12.3996);
person.setResume("擅長程式設計、操作應用系統、網路、資料庫。擅長程式設計、操作應用系統、網路、資料庫。擅長程式設計、操作應用系統、網路、資料庫。");
person.setHeadPortrait(new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 });
manager.persist(person);
檢視資料庫表資料,如下所示。
基本資料型別對映
JPA可以自動對映實體基本的資料型別,而無需使用註解。下面的列表簡單的描述JPA自動把實體的基本資料型別對映為資料庫表字段型別,其中,資料庫表字段型別以MySQL為例。 int、Integer->int或者其他相容型別; long、Long、BigInteger->bigint或者其他相容型別; short、Short->smallint或者其他相容型別; double、Double->double或者其他相容型別; float、Float->float或者其他相容型別; BigDecimal->decimal或者其他相容型別; byte、Byte->binary或者其他相容型別; char、Char->char或者其他相容型別; java.sql.Timestamp->datetime或者其他相容型別; java.sql.Time->time或者其他相容型別;java.sql.Date->date或者其他相容型別;
有些資料型別,則需要使用註解完成對映。下面的列表簡單的描述JPA使用註解把實體的資料型別對映為資料庫表字段型別,其中,資料庫表字段型別以MySQL為例。 byte[]、Byte[]、Serializable,使用註解javax.persistence.Lob,對映成資料庫表字段的blob型別; char[]、Character[]、String使用註解javax.persistence.Lob,對映成資料庫表字段的text型別;
java.util.Date、java.util.Calendar使用註解javax.persistence.Temporal,轉為成資料型別java.sql.Timestamp、java.sql.Time、java.sql.Date,接著對映成資料庫表字段的datetime型別、time型別、date型別。 Enum,使用註解javax.persistence.Enumerated,對映成資料庫表字段的enum型別;