1. 程式人生 > >大物件屬性JPA對映

大物件屬性JPA對映

大物件型別的資料庫表字段

以MySQL為例,儲存字元資料的資料庫表字段型別一般選擇char,varchar,nchar,nvarchar。儲存二進位制資料的資料庫表字段型別一般選擇binary,varbinary。但是,這些型別儲存的資料長度非常有限。比如,我們需要儲存一篇長文章,一個大檔案,這些型別的欄位長度往往就不夠使用了。MySQL常用的大物件型別有兩個,分別是text和blob,分別儲存大字元資料,大二進位制資料。

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;
欄位resume型別是longtext,儲存大字元資料。欄位headPortrait型別是longblob,儲存大二進位制資料。欄位height型別是decimal(4,2),表示整數位和小數位一共4位,其中小數位佔用2位,整數位佔用2位。如果小數位不足2位,用0填充。比如,1.2,儲存為2.20。如果整數位超出2位,比如178報出如下異常。
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'
如果小數位超出2位,不會報出異常,而是使用四捨五入法,結果保留2位小數。比如15.236,儲存為15.27。

實體類

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;
	}
}
註解javax.persistence.Lob,如果屬性的型別是String、char[],則被對映成資料庫欄位的text型別,比如longtext。如果屬性的型別是byte[]、Serializable,則被對映成資料庫欄位的blob型別,比如longblob。

持久化

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型別;