JPA實體中欄位對映補充和嵌入物件
實體中欄位註解的說明
* @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表示需要對映的表中欄位名。相關文章
- mybatis 實體類排除資料庫欄位對映MyBatis資料庫
- 巧用欄位對映實現指定欄位的搜尋
- JPA關係對映系列五:many-to-many 關聯表存在額外欄位關係對映
- 補充行業程式碼欄位行業
- windows域控裡,屬性和欄位對映表Windows
- resultMap 和 resultType 的欄位對映覆蓋問題
- Mybatis處理列名—欄位名對映— 駝峰式命名對映MyBatis
- 將多個JSON欄位對映到單個Java欄位JSONJava
- SpringBoot JPA查詢對映到自定義實體類Spring Boot
- 如何設計投放系統系列—-靈活的欄位對映補全機制
- JAXB(一)——初體驗之實現XML和物件之間的對映XML物件
- JPA關係對映系列四:many-to-many 關聯對映
- oracle時間欄位預設值,hibernate對映Oracle
- ASP.NET Core擴充套件庫之實體對映ASP.NET套件
- MongoDB、Java和物件關係對映MongoDBJava物件
- Spring Boot 入門系列(二十八) JPA 的實體對映關係,一對一,一對多,多對多關係對映!Spring Boot
- HIBERNATE的對映---資料庫表中欄位和對應持久化類中屬性都是自定義型別的?資料庫持久化型別
- M3位帶地址對映和彙編實現對比
- MapStruct實體對映Struct
- 【Mybatis系列】從原始碼角度理解Mybatis欄位對映-AS&ResultMapMyBatis原始碼
- ThinkPHP3.2.3 欄位對映/自動驗證/自動完成PHP
- UI與實體的對映UI
- Mybatis實體關聯對映MyBatis
- wince6.0下的實體地址對映和共享
- 二進位制檔案記憶體對映記憶體
- 為什麼資料庫表的int型別欄位對映到實體類中要使用Integer型別,而不是int型別?...資料庫型別
- jpa~為欄位新增insert的預設值
- 基於AbstractProcessor擴充套件MapStruct自動生成實體對映工具類套件Struct
- 【Mybatis系列】從原始碼角度理解Mybatis欄位對映-駝峰式命名MyBatis原始碼
- 物件型介面 / 定製操作型別和欄位物件型別
- sqlsugar 實現實體類中欄位是字串陣列情況SqlSugar字串陣列
- java物件關係對映ROMJava物件
- 在Watir中進行物件對映(Object Map)的方法物件Object
- Hibernate對檢視對映,當檢視中有空欄位的時候如何解決?
- springboot~jpa審計欄位的自動填充Spring Boot
- Spring Data JPA 之 一對一,一對多,多對多 關係對映Spring
- 記憶體對映檔案詳解-----C++實現(即一塊記憶體和一個檔案相對映對應)記憶體C++
- C語言-對一個結構體中的欄位進行排序C語言結構體排序