JPA實體中欄位對映補充和嵌入物件

z1340954953發表於2018-06-27

實體中欄位註解的說明

* @Column註解用於列對映,name元素用於指定所對映到的列的名稱

* 實體欄位的延遲提取: @Basic註解指定fatch元素,可以把基本對映的提取型別配置為延遲載入。

但是在實際中延遲載入簡單型別的欄位,不會帶來多少資源的節省


* 大型物件

一個儲存資料量很大的字元或者基於位元組的物件,進行對映時候,需要特殊處理

@Lob註解標識某個欄位是大物件,並且當LOB列的名稱需要重寫假定的預設名稱時候,可以和@Column註解同時出現

資料庫中存在兩種LOB: 字元大型物件,稱為CLOB,和二進位制大型物件,稱為BLOB

對映到BLOB列的java型別是:byte[]、Serializable[] ,而char[]、Character[]和String物件對映到CLOB列。

* 列舉型別的對映

列舉型別在Java中的值有一個隱式的序號,由宣告它們的順序所確定。此序號不能在執行時候修改,並且可以用來在資料

庫中表示和儲存改列舉型別的值。


在編譯時候,指定給列舉型別的值的序號分別為FULL_TIME_EMPLOYEE為0 ,定義此型別的一個持久化欄位


但是如果列舉型別發生變化,中間插入一個列舉型別,序號對應的值就會變化,這種情況不允許發生

解決:將值的名稱儲存為字串,在特性上加上一個@Enumerated註解,並制定STRING的值


這種存放列舉型別方法,存在一個問題,如果列舉型別名修改了,也將導致資料受到影響。不過一般不會去改。

很是麻煩,還是直接使用字串對映吧。

* 時間型別

java中時間型別: java.sql.Date、java.sql.Time和java.sql.Timestamp,java.util.Date,java.util.Calendar

java.sql的型別是完全無限制的,行為和簡單對映處理一樣。

但是對於java.util型別需要指明和JDBC驅動程式進行通訊時,使用哪個java.sql型別,藉助註解

@Temporal ,並且指定JDBC型別為TemporalType列舉型別的值(DATE,TIME,TIMESTAMP)

* 瞬態

對於持久化實體的一部分,但是不打算具有永續性的特性,可以加上瞬態修飾符transient或者@Transient註解

嵌入物件

嵌入物件依賴於一個實體確定其標識。它沒有自己的標識,而僅僅是作為實體狀態的一部分,被單獨提取出來,儲存在一個單獨的java物件中,並且該物件附在實體之上。在java中,嵌入物件和關係類似,因為它們是有一個實體引用並作為關聯目標出現。

簡單的說,就是使用一個非實體的物件,作為實體的一個欄位屬性使用,在對映中,會將嵌入物件的欄位,對映到資料庫中

,減少一些公共欄位的編碼的感覺。


比如,employee表中,street,city,state,zip_code欄位是address的,那麼在定義employee實體的時候,只要引入

address嵌入物件的引用就可以了。

當然,嵌入物件必須使用@Embeddable註解標識,@Access訪問的型別

@Embeddable
@Access(AccessType.FIELD)
public class Address {
	@Column(name="street")
	private String street;
	@Column(name="city")
	private String city;
	@Column(name="zip_code")
	private String zip;
	public String getStreet() {
		return street;
	}
	public void setStreet(String street) {
		this.street = street;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getZip() {
		return zip;
	}
	public void setZip(String zip) {
		this.zip = zip;
	}
}

,實體物件中使用加上註解@embedded

@Entity
@Table(name="employee")
public class Employee {
	@Id
	@Column(name="id")
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private Integer id;
	@Column(name="name")
	private String name;
	@Column(name="salary",columnDefinition="DECIMAL(10,2)")
	private BigDecimal salary;
	@Embedded
	private Address address;

如果,一個嵌入物件,兩個實體,都需要使用,但是在另一個實體中對映的欄位名不一樣,此時就需要修改在另一個實體中嵌入物件對映的欄位名稱。


@Embedded
	@AttributeOverrides({
		@AttributeOverride(name="city",column=@Column(name="city_1"))
	})
	private Address address;
name表示嵌入物件的欄位名,column表示需要對映的表中欄位名。


相關文章