Hibernate4學習總結(3)--註解形式的基礎對映,主鍵對映,基本屬性對映,複合屬性對映,繼承對映。
Hibernate Annotation即hibernate註解,可以通過另一種方式將持久化類轉化成表的相關資訊,可以簡化hibernate的配置檔案。本文主要對Hibernate的註解進行講解,由於篇幅原因,將註解部分分為兩篇文章來寫。集合對映和關聯關係對映將在後面一文講解。本文包括以下五個部分:
- 基礎對映。
- 主鍵對映。
- 基本屬性對映。
- 複合屬性對映。
- 繼承對映。
一、基礎對映(註解加在持久化類上面)
1.1到1.4的註解都是JPA的註解,1.5是hibernate的註解。
1.1 @Entity: 將POJO轉化成持久化類。
1.2 @Table: 把持久化類轉化成表的相關資訊,@Table註解當中有以下幾個屬:
- name: 指定表名。
- schema: 指定將資料表存入哪個資料庫。
- catalog: 指定將資料表存入哪個資料庫。
- indexes: 指定表的引索列.
- uniqueConstraints: 指定唯一約束。
1.3 indexes : @Index(columnList="資料表中的列名", name="索引名")。用於建立表的索引。
indexes={@Index(columnList="name", name="IDX_NAME"),
@Index(columnList="address", name="IDX_ADDRESS")}
1.4 uniqueConstraints : @UniqueConstraint(columnNames={"列名","列名"}, name="唯一約束名")。用於多列建立聯合唯一約束。uniqueConstraints={@UniqueConstraint(columnNames={"name", "age"}, name="UC_NAME_AGE")})
1.5 hibernate註解
- @DynamicInsert:動態插入,根據持久化物件的屬性是否有值明確生成insert語句。
- @DynamicUpdate:動態修改,它會判斷持久化物件中屬性,哪些屬性值發生了改變就會生成update的語句。(持久化狀態下做修改)
- @SelectBeforeUpdate:修改之前先查詢,查詢得到持久化物件再與脫管狀態下的物件進行比較,哪些屬性值發生了改變就會生成update的語句。(脫管狀態下做修改)
例如:User實體類
package edu.scut.a_BasicMapping;
import javax.persistence.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SelectBeforeUpdate;
@Entity//將POJO類轉化成持久化類
@Table(name="USER_INFO",//指定表名
catalog="day33b",//指定建立到哪個資料庫
//schema="day33b",//指定建立到哪個資料庫,和catalog指定一個即可
indexes={@Index(columnList="name",name="IDX_NAME"),
@Index(columnList="address",name="IDX_ADDRESS")},//建立表的索引
uniqueConstraints={@UniqueConstraint(columnNames={"name","age"},name="UC_NAME_AGE")}) //多列聯合唯一約束
//三個hibernate註解
//@DynamicInsert(true) //動態插入,根據持久化物件的屬性是否有值,生成相應的Sql語句
//@DynamicUpdate(true) //動態修改,會判斷持久化物件中的屬性,那些屬性改變,才會生成相應的update語句(持久化狀態下做修改)
@SelectBeforeUpdate(true) //修改之前先進行查詢,查詢得到持久化物件與脫管狀態下的物件進行比較,那些屬性改變生成sql語句。
public class User {
@Id
private int id;
private String name;
private int age;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
生成的表user_info資訊:
二、主鍵對映
2.1 主鍵生成策略
@GeneratorValue(strategy=GenerationType.xxx)
- GenerationType.AUTO:讓Hibernate根據資料庫方言自動選擇主鍵生成策略。
- GenerationType.IDENTITY: 適宜MySQL、SqlServer有自增長列的資料庫。
- GenerationType.SEQUENCE:適宜Oracle這種沒有自增長有sequence的資料庫。
- GenerationType.TABLE: 適宜所有的資料庫,因為它會單獨生成一張表來維護主鍵生成。
例如:User.實體類
package edu.scut.b_PrimaryKeyMapping.copy;
import java.io.Serializable;
import javax.persistence.*;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import org.hibernate.annotations.SelectBeforeUpdate;
@Entity//將POJO類轉化成持久化類
@Table(name="USER_INFO")//指定表名
public class User{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private int age;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
生成的表user_info資訊:
2.2 單個屬性做主鍵: 在指定的屬性上加@Id。
2.3 多個屬性做聯合主鍵。
- 在多個屬性上加@Id。
- 這個持久化類必須實現Serializale介面。
例如:Person類的firstName和lastName兩個屬性要做聯合主鍵,那麼這兩個屬性上面都要加@Id註解,並且Person類要是實現Serializale介面。
Person實體類:
package edu.scut.b_PrimaryKeyMapping;
import java.io.Serializable;
import javax.persistence.*;
@Entity
public class Person implements Serializable {
@Id
private String firstName;
@Id
private String lastName;
private int age;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.4 複合屬性做聯合主鍵。
- 在複合屬性上加:@EmbeddedId。
- 複合屬性類必須實現Serializale介面。
例如:Employee實體類中,name屬性是一個複合屬性,要是以name屬性作為主鍵,那麼name屬性上要加@Embedded註解,Name類要實現Serializale介面。
Employee類:
package edu.scut.b_PrimaryKeyMapping;
import java.io.Serializable;
import javax.persistence.*;
@Entity
public class Employee implements Serializable {
@EmbeddedId
private Name name;
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Name類:
package edu.scut.b_PrimaryKeyMapping;
import java.io.Serializable;
public class Name implements Serializable{
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
三、基本屬性對映
3.1 @Column : 持久化類中屬性轉化成資料庫表中列的相關資訊。
- name:指定列名。
- length: 該列支援的長度。
- precision:有效的總位數。(BigDecimal)。
- scale:小數點的位數。(BigDecimal)。
- unique: 唯一約束。
- nullable:非空約束。
- insertable:是否允許插入true:允許 false: 不允許。
- updatable:是否允許修改true:允許 false: 不允許。
- columnDefinition :指定列的定義。
例如:User類
package edu.scut.c_BasicFieldMapping;
import java.io.Serializable;
import java.math.BigDecimal;
import javax.persistence.*;
import org.hibernate.type.TrueFalseType;
@Entity//將POJO類轉化成持久化類
@Table(name="USER_INFO")//指定表名
public class User{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="U_ID")
private int id;
@Column(name="U_NAME",//列名
length=20, //長度
nullable=false, //非空約束
unique=false //唯一約束
)
private String name;
@Column(name="U_AGE",columnDefinition="int(10) NOT NULL default 20")
private int age;
@Column(name="U_ADD",
insertable=false, //允許插入
updatable=false //允許修改
)
private String address;
@Column(name="U_SALARY",
precision=6, //小數的總位數
scale=2)//小數點後面的位數
private BigDecimal salary;
public int getId() {
return id;
}
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
生成的表user_info資訊:
3.2 @Lob: 對映大的二進位制數或者文字。
3.3 @Temporal:修飾日期型別Date。
- TemporalType.DATE : yyyy-MM-dd。
- TemporalType.TIME : HH:mm:ss。
- TemporalType.TIMESTAMP : yyyy-MM-dd HH:mm:ss。
3.4 @Transient:指定不是持久化屬性。
例如:Employee實體類
package edu.scut.c_BasicFieldMapping;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
@Entity
@Table(name="EMP_INFO")
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="EMP_ID")
private int id;
@Column(name="EMP_NAME")
private String name;
@Column(name="EMP_PIC")
@Lob
private byte[] picture;
@Column(name="EMP_BIRTH")
@Temporal(TemporalType.TIMESTAMP)
private Date birthday;
@Transient
private String remark;
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] getPicture() {
return picture;
}
public void setPicture(byte[] picture) {
this.picture = picture;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
生成的表emp_info資訊:
四、複合屬性對映
4.1 @Embedded:用於修飾複合屬性(內含的)。
例如:Employee類中的name屬性是複合屬性,要用@Embedded註解修飾。
Employee實體類:
package edu.scut.d_MultiFieldMapping;
import java.io.Serializable;
import javax.persistence.*;
@Entity
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Embedded //複合屬性(將主鍵類的屬性直接應用過來)
private Name name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Name實體類:
package edu.scut.d_MultiFieldMapping;
import java.io.Serializable;
import javax.persistence.Column;
public class Name implements Serializable {
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
注意:複合屬性的列名可以重新命名,有兩種方式。4.2 @AttributeOverrides:第一種屬性重新命名。在複合屬性的上面加此註解。
@AttributeOverrides({@AttributeOverride(name="firstName", [email protected](name="F_NAME")),
@AttributeOverride(name="lastName", [email protected](name="L_NAME"))})
例如:Employee實體類
package edu.scut.d_MultiFieldMapping;
import java.io.Serializable;
import javax.persistence.*;
@Entity
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
@Embedded //複合屬性(將主鍵類的屬性直接應用過來)
//改變複合屬性的名稱(第一種方式)
@AttributeOverrides({@AttributeOverride(name="firstName",[email protected](name="F_NAME")),
@AttributeOverride(name="lastName",[email protected](name="L_NAME"))})
private Name name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4.3 第二種屬性重新命名方式:複合屬性類的屬性上面直接加@Column註解,給出列名。
例如:Name實體類
package edu.scut.d_MultiFieldMapping;
import java.io.Serializable;
import javax.persistence.Column;
public class Name implements Serializable {
@Column(name="F_NAME") //改變複合屬性名稱的第二種方式
private String firstName;
@Column(name="L_NAME")
private String lastName;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
五、繼承對映
當持久化類存在繼承關係時,就可以用繼承對映。繼承對映提供了三種策略:
5.1 第一種方式(SINGLE_TABLE):所有子類中屬性都生成到父類表中(一張表)。
注意:所有子類屬性中不能加非空約束。
5.1.1 父類
- @Entity @Table(name="PER_INFO")。指定表名。
- @Inheritance(strategy=InheritanceType.SINGLE_TABLE)。生成一張表。
- @DiscriminatorColumn(name="DC", discriminatorType=DiscriminatorType.INTEGER) 。辨別者列,用來分辨每一行的資訊對應的是哪個類的資料。
- @DiscriminatorValue("1") 。辨別者列值,即每一個類的辨別者的不同代號。
父類:Person
package edu.scut.g_ExtendsMapping2; import javax.persistence.*; @Entity @Table(name="PER_INFO") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) //只生成一張表 @DiscriminatorColumn(name="DC",discriminatorType=DiscriminatorType.INTEGER) //辨別者列 @DiscriminatorValue("1") //辨別者列的值 public class Person { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
5.1.2 所有子類
- @Entity。
- @DiscriminatorValue("2")。指定辨別者列值。
子類:Employee
子類:Managerpackage edu.scut.g_ExtendsMapping2; import javax.persistence.*; @Entity @DiscriminatorValue("2") //辨別者列的值 public class Employee extends Person{ private float salary; public float getSalary() { return salary; } public void setSalary(float salary) { this.salary = salary; } }
package edu.scut.g_ExtendsMapping2; import javax.persistence.*; @Entity @DiscriminatorValue("3") //辨別者列 public class Manager extends Employee{ private String job; public String getJob() { return job; } public void setJob(String job) { this.job = job; } }
這三個類生成了一張表:
per_info表
5.2 第二種方式(JOINED):所有的子類與父類都會單獨生成表(子類表的中主鍵列同時也是外來鍵列,它引用頂級父類表中的主鍵列)。
注意:查詢時會出現很多join語句。
5.2.1 父類
- @Entity @Table(name="PER_INFO")。
- @Inheritance(strategy=InheritanceType.JOINED)。
父類:Person
5.2.2 子類package edu.scut.g_ExtendsMapping1; import javax.persistence.*; @Entity @Table(name="PER_INFO") @Inheritance(strategy=InheritanceType.JOINED) //會生成多張表,幾個持久化類就生成幾張表 public class Person { @Id @GeneratedValue(strategy=GenerationType.AUTO) private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
- @Entity @Table(name="")。
子類:Employee
package edu.scut.g_ExtendsMapping1; import javax.persistence.Entity; @Entity public class Employee extends Person{ private float salary; public float getSalary() { return salary; } public void setSalary(float salary) { this.salary = salary; } }
子類:Manager生成的三張表資訊:package edu.scut.g_ExtendsMapping1; import javax.persistence.Entity; @Entity public class Manager extends Employee{ private String job; public String getJob() { return job; } public void setJob(String job) { this.job = job; } }
per_info表
employee表
manager表
5.3 第三種方式(TABLE_PER_CLASS):所有的子類與父類都會單獨生成表,子類會把父類中的屬性繼承過來生成在自己的表中。
注意:這種策略主鍵不能用自增長,查詢時會出現union運算。
5.3.1 父類
- @Entity @Table(name="PER_INFO")。
- @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)。
父類:Person
package edu.scut.g_ExtendsMapping3; import javax.persistence.*; @Entity @Table(name="PER_INFO") @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) public class Person { @Id //@GeneratedValue(strategy=GenerationType.AUTO) 這種策略的ID不能自增長 private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
5.3.2 子類
- @Entity @Table(name="")。
子類:Employee
package edu.scut.g_ExtendsMapping3; import javax.persistence.Entity; @Entity public class Employee extends Person{ private float salary; public float getSalary() { return salary; } public void setSalary(float salary) { this.salary = salary; } }
子類:Manager
生成的三張表資訊:package edu.scut.g_ExtendsMapping3; import javax.persistence.Entity; @Entity public class Manager extends Employee{ private String job; public String getJob() { return job; } public void setJob(String job) { this.job = job; } }
per_info表
employee表
manager表
相關推薦
Hibernate4學習總結(3)--註解形式的基礎對映,主鍵對映,基本屬性對映,複合屬性對映,繼承對映。
Hibernate Annotation即hibernate註解,可以通過另一種方式將持久化類轉化成表的相關資訊,可以簡化hibernate的配置檔案。本文主要對Hibernate的註解進行講解,由於篇幅原因,將註解部分分為兩篇文章來寫。集合對映和關聯關係對映將
mysql資料庫基礎學習總結3(查詢)
012.多表查詢 013.多表連線 1.多表查詢 語法: select * from table1,table2;
python 學習總結3
今天 pre 小程序 brush mas 返回 等待 add 學習總結 今天學習了socket的一些知識,主要為socket模塊中socket()類及其父類的一些方法 只要包括: sock=socket.socket() sk.bind(address) #
javaweb學習總結(十五)——JSP基礎語法(轉)
troy 嚴格 too cal service alt 隱式 情況 當前系統時間 任何語言都有自己的語法,JAVA中有,JSP雖然是在JAVA上的一種應用,但是依然有其自己擴充的語法,而且在JSP中,所有的JAVA語句都可以使用。 一、JSP模版元素 JSP頁面中的H
Kubernetes 學習總結(3) Manifests
replicas 字母 network delay 擴展 wide 運行 節點 ports APIserver符合RESTful風格,支持GET/PUT/DELETE/POST等各種操作。所以也支持kubectl通過一系列命令對各處資源進行管理控制。常用的資源1)、work
Linq to Sql學習總結3
儲存過程: 關係資料庫中的儲存過程在實體類中對映為具體的方法,直接將儲存過程拖動到對應的dbml設計檢視中即可,如圖: 在將儲存過程拖入dbml設計檢視中時,系統執行了如下命令: SET FMTONLY ON;--表示只獲取結果集的元資料(即相關列名 ) exec sp_Name SET
Web Service學習總結(3)xml操作相關的類
C#操作XML方法:新增、修改和刪除節點與屬性:https://www.cnblogs.com/lip-blog/p/7652544.html XElement與XmlElement相互轉換的程式碼:https://blog.csdn.net/xieyufei/article/det
SpringBoot2.X學習總結:(1)註解部分
@SpringBootApplication包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan,一個註解相當於三個註解
RGB-D SLAM學習總結(3)
第三講 特徵提取和匹配 本講主要實現影象的特徵提取,影象間的匹配,以及相機轉換矩陣的求解。 高博的部落格中提供了兩幀影象做測試,就是這兩幀影象。。。千萬不要另存為。。。 由於具體程式碼已經有詳細介紹,這裡只往slamBase裡新增方法。 另外在使用的slambase標
學習總結3
1陣列知識點 一維陣列 一維陣列的定義 儲存型別 資料型別 陣列名 [整數1]…[整數n],例如:int a[100],要注意下標從0開始,a[0]…a[99]。說明陣列時元素個數一定要為常量。陣列的排序有選擇排序、插入排序、氣泡排序。陣列排序還有一個函式sort,預設sort函式為升序,s
C語言學習總結3
c語言學習總結3 1,知識點總結 陣列是一組有序資料的集合,下標代表資料在陣列中的序號,用一個數組名和下標來唯一確定陣列中的元素,且每一個元素都屬於同一資料型別。陣列有一維陣列和二維陣列,使用陣列時要先進行定義,陣列的建立方式:型別符 陣列名[常量表達式 ],常量表達式最好大一些,防止陣列越界。陣列
Hessian知識學習總結(一)——基礎知識
1. hessian簡介: 提起hessian,文章裡基本都會提到這幾個關鍵詞,“WebService”,“二進位制”,“RMI(遠端方法呼叫)”,“介面暴露”,“Binary RPC協議”,“配置簡單”等。 簡單摘錄一下,hessian是一
python核心高階學習總結3-------python實現程序的三種方式及其區別
python實現程序的三種方式及其區別 在python中有三種方式用於實現程序 多程序中, 每個程序中所有資料( 包括全域性變數) 都各有擁有⼀份, 互不影響 1.fork()方法 ret = os.fork() if ret == 0: #子程序 else:
JDBC學習總結1(JDBC基礎)
001.JDBC 1.JDBC:java database connectivity ; java連線資料庫 簡單來說,jdbc就是一組規範;將對所有關係型資料庫的操作都抽象出來的規範; 作用:採用統一的方式來操作各種資料庫; 2.如何通過jdbc來訪
weui學習總結——3、微信樣式介面切換
前言:weui是一個專門用於開發手機移動web或微信的樣式庫。但是官方只提供了demo沒有提供相關文件,所以這篇部落格就當是方便以後開發而使用吧。 weui資源下載(也可以從官網下載): http://download.csdn.net/download/z
Spark學習(3)——scala基礎語法
scala概述 scala是一門多正規化程式語言,集成了面向物件程式設計和函數語言程式設計等多種特性。 scala執行在虛擬機器上,併兼容現有的Java程式。 Scala原始碼被編譯成java位元組碼,所以執行在JVM上,並可以呼叫現有的Java類庫 scala
Python學習筆記3:Python基礎
1、語句和語法 (1)註釋(#) (2)繼續( \) 存在兩種例外情況,一個語句不使用反斜線也可以跨行: 在使用閉合操作符(小括號,中括號,花括號)時單一語句可跨多行; 使用三引號包括下的字串
react學習總結3--React-Router
react 學習總結–React-Router 說明 react-route 版本 : “^3.0.0” react-router-redux 版本 ; “^4.0.7”
Struts2學習總結(3)--值棧,Ognl表示式,Struts標籤庫,國際化,資料校驗,攔截器
本文包括以下五個部分: 值棧。Ognl表示式。struts2標籤庫。國際化。表單資料校驗攔截器。struts2的執行過程。一、值棧 採用servlet和JSP開發時,servlet通過域物件儲存資料,在JSP頁面通過jstl標籤+el表示式獲取資料。 採用struts2和
最全java多執行緒學習總結1--執行緒基礎
《java 核心技術》這本書真的不錯,知識點很全面,翻譯質量也還不錯,本系列博文是對該書中併發章節的一個總結。 什麼是執行緒 官方解釋:執行緒是作業系統能夠進行運算排程的最小單位,包含於程序之中,是程序中的實際運作單位。也就是說執行緒是程式碼執行的載體,我們所編寫的程式碼都是線上程上跑的,以一個最簡單