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 的欄位對映覆蓋問題
- SpringBoot JPA查詢對映到自定義實體類Spring Boot
- 將多個JSON欄位對映到單個Java欄位JSONJava
- 如何設計投放系統系列—-靈活的欄位對映補全機制
- MapStruct實體對映Struct
- Spring Boot 入門系列(二十八) JPA 的實體對映關係,一對一,一對多,多對多關係對映!Spring Boot
- JPA關係對映系列四:many-to-many 關聯對映
- ASP.NET Core擴充套件庫之實體對映ASP.NET套件
- M3位帶地址對映和彙編實現對比
- ThinkPHP3.2.3 欄位對映/自動驗證/自動完成PHP
- 【Mybatis系列】從原始碼角度理解Mybatis欄位對映-AS&ResultMapMyBatis原始碼
- Mybatis實體關聯對映MyBatis
- UI與實體的對映UI
- 物件對映 - Mapping.Mapster物件APP
- jpa~為欄位新增insert的預設值
- springboot~jpa審計欄位的自動填充Spring Boot
- 基於AbstractProcessor擴充套件MapStruct自動生成實體對映工具類套件Struct
- 二進位制檔案記憶體對映記憶體
- ASP.NET Core 中的物件對映之 AutoMapperASP.NET物件APP
- 為什麼資料庫表的int型別欄位對映到實體類中要使用Integer型別,而不是int型別?...資料庫型別
- 【Mybatis系列】從原始碼角度理解Mybatis欄位對映-駝峰式命名MyBatis原始碼
- 將list型別對映到資料欄位 @TableField(typeHandler = StringListTypeHandler.class)型別
- MapStruct 解了物件對映的毒Struct物件
- Javascript - 物件對映automapper介紹JavaScript物件APP
- java物件關係對映ROMJava物件
- Spring Data JPA 之 一對一,一對多,多對多 關係對映Spring
- sqlsugar 實現實體類中欄位是字串陣列情況SqlSugar字串陣列
- Java實體對映工具MapStruct詳解JavaStruct
- ReadFile 和 補充CreateFile
- Mapster 高效能物件對映框架物件框架
- Redis OM .NET Redis物件對映框架Redis物件框架
- C# 高效能物件對映C#物件
- Scala的類、屬性、物件欄位物件
- Hibernate/JPA中如何合併實體集合?