1. 程式人生 > >JPA實體中欄位對映補充和嵌入物件

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",[email protected](name="city_1"))
	})
	private Address address;
name表示嵌入物件的欄位名,column表示需要對映的表中欄位名。

相關推薦

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

實體中欄位註解的說明* @Column註解用於列對映,name元素用於指定所對映到的列的名稱* 實體欄位的延遲提取: @Basic註解指定fatch元素,可以把基本對映的提取型別配置為延遲載入。但是在實際中延遲載入簡單型別的欄位,不會帶來多少資源的節省* 大型物件一個儲存資料

JPA實體 檢視的對映,列舉欄、外來鍵欄轉換顯示

有一個避不開的問題,業務表中有很多比如說部門編碼、人員ID , 外來鍵ID,等欄位 , 在顯示的時候要顯示對應的中文名稱,本次採用使用建立檢視的方式解決, 因為本次專案使用spring data , 底層用的hibernate jpa 。結果發現檢視無法和實體對映,查詢資料可

models中欄引數blanknull的用法區別

blank當blank=True時,說明此處的資料可以不填,預設情況下為False,也就意味著預設情況下,所輸入的資料不得空,blank是和頁面表單有關,在頁面需要輸入引數的時候,如果在models裡面定義了blank=True時,那麼這個引數是可以不填寫的,如果是預設的話,如果沒有填寫,則會提示錯誤。 n

MySql表中欄為Null 空('') 有什麼區別, 分別有什麼影響?

資料準備 insert into user VALUES (6,NULL,1,0,1,NULL); insert into user VALUES (7,'',10,0,0,''); 然後我們編寫了一個簡單的小程式查詢這兩條記錄 public User

JPA實體關聯關係對映之概述

    一、簡介 首先來說關聯關係是面向物件分析,面向物件設計最重要的部分,JPA是完全可以通過對映來簡化資料持久化到資料,和Hibernate一樣,JPA的關聯關係也分為兩種,一種是單向關聯,一種是雙向關聯: 單向關聯:只需要單向訪問關聯端,比如說:我們只能通過某一學期訪

JPA實體繼承的對映

注:文章中據說的實體指的是被@Entity註解的類。 JPA中物件關係對映通常情況下是一個實體對應一個表,兩個實體之間沒有任何關係。如果兩個實體之間是繼承關係,那麼該如何對映呢? JPA中的實體支援繼承對映,多型關聯,多型查詢。抽象類和具體的類都可以是實體,且都可以使用@

Spingboot自動生成生成實體類、對映XMLDao

首先,咱們先建立一個新的springboot專案, 在Web選項中勾選Web,在Template Engines選項中勾選 Thymeleaf,在SQL選項中勾選MySQL和MyBatis。然後一直下一步到完成,專案結構為: pom.xml檔案如下: &l

Mybatis自動生成對映檔案PO物件呼叫示例程式碼工

 src/generatorConfig.properties suppressAllComments=false driverClass=oracle.jdbc.driver.OracleDriver url=jdbc:oracle:thin:@localhost:152

spring data jpa 實體中欄不與資料庫表對映

當我們使用spring data jpa開發的時候,會將實體類中的成員變數與表中的欄位一一對應,當我們在實體類中加上一個不與資料庫表一一對應的成員變數的時候,此時我們只要在這個成員變數上加上註解@Transient @Transient private String[

JPA專案使用myeclipse建立帶註解的model實體類&web工程使用MyEclipse自動生成hibernate對映檔案實體

做過一個web專案用了jpa,需要其中的註解的model實體類手寫太麻煩,其他的dao、service、action(or controller)都是拖過來直接改名就可以了 1.先新建JPA專案: 如果沒有就點選左下角的Show All Wizards.

JPA設定表名實體名,表字段與實體的對應

首先 你的jpaProperties配置項中要有 <prop key="hibernate.hbm2ddl.auto">update</prop>這樣就可以直接有物件對映為表結構,實現面向物件向資料庫轉化。 實體的名字可以和表名字不一樣,欄位名字和實

淺析Linux 64系統虛擬地址實體地址的對映及驗證方法

# 虛擬記憶體 先簡單介紹一下作業系統中為什麼會有虛擬地址和實體地址的區別。因為Linux中有程序的概念,那麼每個程序都有自己的獨立的地址空間。 現在的作業系統都是64bit的,也就是說如果在使用者態的程序中建立一個64位的指標,那麼在這個程序中,這個指標能夠指向的範圍是0~0xFFFFFFFFFFFFFF

JPA 實體生命週期理解總結(轉)

(1)前言: 最近在使用Spring Data Jpa開發的時候,發現更新單個物件的時候,可以這麼寫:  @Transactional(value = "oracleTM")  public E update(Serializable id, E newEntity)

spring事務管理,基於xml配置完成事務回滾;spring中資料庫表中欄pojo中屬性名不一致時候,實現RowMapper介面手動封裝

宣告使用JDK8,spring5.0.7, 測試說明: service 層 宣告介面進行轉賬,從A轉賬B ,然後對AB 進行更新操作,在事務中對find方法開啟 只讀許可權,無法進行更新操作,造成事務回滾進行測試事務; 主要測試方法:* void tra

使用mybatis外掛generator生成實體類,dao層mapper對映

    本文主要講如何使用generator外掛自動生成我們所需要的實體類,Dao層和對應的mapper對映檔案,首先講一下命令列下用本地jar包使用,然後再講專案中整合進generator外掛進行生成。現在教程開始(Mysql資料庫為例) 一  本

SpringBoot:SpringData JPA:進階查詢—JPQL/原生SQL查詢、分頁處理、部分欄對映查詢

上一篇介紹了入門基礎篇SpringDataJPA訪問資料庫。本篇介紹SpringDataJPA進一步的定製化查詢,使用JPQL或者SQL進行查詢、部分欄位對映、分頁等。本文儘量以簡單的建模與程式碼進行展示操作,文章比較長,包含查詢的方方面面。如果能耐心看完這篇文章,你應該能使用SpringDataJ

C#語言中欄屬性相關知識剖析

針對C#中的欄位和屬性,很多初學者無法區分這兩者之間的區別。 欄位與屬性比較 欄位;是一種“成員變數”,一般在類的內部做資料互動使用,佔用記憶體空間。 屬性:a.是一種邏輯變數,一般跟欄位一起結合起來使用,是欄位的擴充套件,並不佔用實際的記憶體。        

mysql資料庫查詢語句中欄型別不匹配出現異常,查詢或更新多條的原因

說明 表結構和where查詢的欄位型別一致,均為字串或者是整數,不會型別轉化 表結構和where查詢的欄位型別不一致: 一個為TIMESTAMP或者是DATETIME,另一個為常量,常量會轉化為TIMESTAMP,再進行比較 一個為DECIMAL或者是整數,整數會轉化

C#中欄不被序列化成JSONXML

將一個類序列化成JSON或XML時,如果某個欄位或屬性不想被序列化,則可以使用以下Attribute: 1、[Newtonsoft.Json.JsonIgnore]特性:使用Newtonsoft.Json序列化時欄位不會被序列化。 2、[System.Web.Script

用MyEclipse自動生成hibernate對映檔案實體

建web工程,使用Hibernate的時候,在工程裡一個一個建立實體類和對映檔案太麻煩,特別是大專案,好幾百張表,每個表跟每個表的對應關係很負責,一張表中可能有超級多的欄位,浪費時間,還容易出錯! 建立完成後還要將一個個的對映檔案配置到hibernate.cfg.xml中,