hibernate註解配置
1、配置對映關係的xml方式
我們知道,Hibernate是一個典型的ORM框架,用以解決物件和關係的不匹配。其思想就是將關係資料庫中表的記錄對映成為物件,以物件形式展現,這樣一來,就可以把對資料庫的操作轉化為對物件的操作。 而ORM一般是採用xml的格式儲存物件與關係資料表的對映,我們也可以從下面示例中看到hibernate中的一個對映配置表的表現形式:<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<classname="com.zker.model.job.SysJob"table="SYS_JOB"lazy="true">
<idname="jobId"column="JOB_ID">
<generatorclass="sequence">
<paramname="sequence">SEQ_SYS_JOB</param>
</generator>
</id>
<propertyname="jobName"type="string"column="JOB_NAME"/>
<propertyname="jobDesc"type="string"column="JOB_DESC"/>
<propertyname="lastModity"type="timestamp"column="LAST_MODIFY"/>
<!--與使用者關聯-->
<setname="sysUsers"table="SYS_USER">
<keycolumn="JOB_ID"/>
<one-to-many
</set>
</class>
</hibernate-mapping>
publicclassSysJob{
/**職位的主鍵ID*/
privateint jobId;
/**職位的名稱*/
privateString jobName;
/**職位的描述*/
privateString jobDesc;
/**職位的修改時間*/
privateTimestamp lastModity;
/**職位所對應的使用者*/
privateSet<SysUser> sysUsers =newHashSet<SysUser>();
publicint getJobId(){
return jobId;
}
publicvoid setJobId(int jobId){
this.jobId = jobId;
}
publicString getJobName(){
return jobName;
}
publicvoid setJobName(String jobName){
this.jobName = jobName;
}
publicString getJobDesc(){
return jobDesc;
}
publicvoid setJobDesc(String jobDesc){
this.jobDesc = jobDesc;
}
publicTimestamp getLastModity(){
return lastModity;
}
publicvoid setLastModity(Timestamp lastModity){
this.lastModity = lastModity;
}
publicSet<SysUser> getSysUsers(){
return sysUsers;
}
publicvoid setSysUsers(Set<SysUser> sysUsers){
this.sysUsers = sysUsers;
}
}
2、註解的優點
而完成這個ORM對映關係配置的方式,還有一種,就是使用註解。- 充分利用 Java 的反射機制獲取類結構資訊,這些資訊可以有效減少配置的工作
- 註釋和 Java 程式碼位於一個檔案中,有助於增強程式的內聚性,便於程式設計師開發
@Entity
@Table(name ="t_student")
@Domain(name ="學生")
@Generated
@DataIdentify(identifies ="number")
publicclassStudentextendsBaseDomain<Student>implementsAddable,Modifiable<Student>,Deletable{
privateString name;
privateString number;
privateSex sex;
@Basic
@NotSemanticNull(groups ={Groups.Add.class,Groups.Update.class})
@Property(name ="姓名")
publicString getName(){
return name;
}
publicvoid setName(String name){
this.name = name;
}
...
}
3、常用註解的使用方法
3.1 類級別的註解
- @Entity 對映實體類
- @Table 對映數句庫表
- 屬性:
- name
- 可選,對應資料庫中的一個表。若表名與實體類名相同,則可以省略
- 屬性:
- name
- 可選,表示表的名稱,預設的表名和實體名稱一致,只有在不一致的情況下才需要指定表名
- catalog
- 可選,表示Catalog 名稱,預設為 Catalog("")
- schema
- 可選 , 表示 Schema 名稱 , 預設為Schema("")
3.2 屬性級別的註解
- @Id 對映生成主鍵
- @GeneratedValue 定義主鍵生成策略
- @SequenceGenerator 聲明瞭一個數據庫序列
- @Version 定義樂觀鎖
- @Basic 宣告屬性的存取策略
- @Column 對映表的列
- @Transient 定義暫態屬性
3.2.1 與主鍵相關注解
@Id - 必須,定義了對映到資料庫表的主鍵的屬性,一個實體只能有一個屬性被對映為主鍵,置於 getXxx() 前@GeneratedValue(strategy = GenerationType , generator="") - 可選,用於定義主鍵生成策略
- 屬性:
- strategy
- 表示主鍵生成策略,取值有:
- GenerationType.AUTO 根據底層資料庫自動選擇(預設),若資料庫支援自動增長型別,則為自動增長
- GenerationType.INDENTITY 根據資料庫的Identity欄位生成,支援DB2、MySQL、MS、SQL Server、SyBase與HyperanoicSQL資料庫的Identity型別主鍵
- GenerationType.SEQUENCE 使用Sequence來決定主鍵的取值,適合Oracle、DB2等支援Sequence的資料庫,一般結合@SequenceGenerator使用(Oracle沒有自動增長型別,只能用Sequence)
- GenerationType.TABLE 使用指定表來決定主鍵取值,結合@TableGenerator使用
- generator
- 表示主鍵生成器的名稱,這個屬性通常和ORM框架相關 , 例如:Hibernate 可以指定 uuid 等主鍵生成方式
- 屬性:
- name
- 表示該表主鍵生成策略名稱,它被引用在@GeneratedValue中設定的“gernerator”值中
- sequenceName
- 表示生成策略用到的資料庫序列名稱
- initialValue
- 表示主鍵初始值,預設為0
- allocationSize
- 每次主鍵值增加的大小,例如設定成1,則表示每次建立新記錄後自動加1,預設為50
3.2.2 與非主鍵相關注解
@Version - 可以在實體bean中使用@Version註解,通過這種方式可新增對樂觀鎖定的支援(見參考連結)@Basic - 用於宣告屬性的存取策略:
- @Basic(fetch=FetchType.EAGER) 即時獲取(預設的存取策略)
- @Basic(fetch=FetchType.LAZY) 延遲獲取
- 屬性:
- name
- 可選,表示資料庫表中該欄位的名稱,預設情形屬性名稱一致
- nullable
- 可選,表示該欄位是否允許為 null,預設為 true
- unique
- 可選,表示該欄位是否是唯一標識,預設為 false
- length
- 可選,表示該欄位的大小,僅對 String 型別的欄位有效,預設值255
- insertable
- 可選,表示在ORM框架執行插入操作時,該欄位是否應出現INSETRT語句中,預設為 true
- updateable
- 可選,表示在ORM 框架執行更新操作時,該欄位是否應該出現在UPDATE 語句中,預設為 true。對於一經建立就不可以更改的欄位,該屬性非常有用,如對於 birthday 欄位
- columnDefinition
- 可選,表示該欄位在資料庫中的實際型別。通常ORM 框架可以根據屬性型別自動判斷資料庫中欄位的型別,但是對於Date 型別仍無法確定資料庫中欄位型別究竟是 DATE,TIME 還是 TIMESTAMP. 此外 ,String 的預設對映型別為 VARCHAR, 如果要將 String 型別對映到特定資料庫的 BLOB或 TEXT 欄位型別,該屬性非常有用
3.3 對映實體類的關聯關係
單向一對多:一方有集合屬性,包含多個多方,而多方沒有一方的引用。使用者--->電子郵件 單向多對一:多方有一方的引用,一方沒有多方的引用。論文類別---> 類別 雙向一對多:兩邊都有多方的引用,方便查詢。班級---> 學生 雙向多對一:兩邊都有多方的引用,方便查詢。 單向多對多:需要一箇中間表來維護兩個實體表。論壇--->文章 單向一對一:資料唯一,資料庫資料也是一對一。艦船---> 水手 主鍵相同的一對一:使用同一個主鍵,省掉外來鍵關聯。客戶---> 地址3.3.1 關聯對映的一些共有屬性
@JoinColumn - 可選,用於描述一個關聯的欄位。@JoinColumn和@Column類似,介量描述的不是一個簡單欄位,而是一個關聯欄位,例如描述一個 @ManyToOne 的欄位。(即用來定義外來鍵在我們這個表中的屬性名,例如實體Order有一個User user屬性來關聯實體User,則Order的user屬性為一個外來鍵)- 屬性:
- name - 該欄位的名稱,由於@JoinColumn描述的是一個關聯欄位,如ManyToOne, 則預設的名稱由其關聯的實體決定
- fetch - 配置載入方式。取值有:
- Fetch.EAGER - 及時載入,多對一預設是Fetch.EAGER
- Fetch.LAZY - 延遲載入,一對多預設是Fetch.LAZY
- cascade
- 設定級聯方式,取值有:
- CascadeType.PERSIST - 儲存
- CascadeType.REMOVE - 刪除
- CascadeType.MERGE - 修改
- CascadeType.REFRESH - 重新整理
- CascadeType.ALL - 全部
- targetEntity
- 配置集合屬性型別,如:@OneToMany(targetEntity=Book.class)
主表類A與從表類B的主鍵值相對應
主表:
@OneToOne(cascade =CascadeType.ALL)
@PrimaryKeyJoinColumn
public B getB(){
return b;
}
從表:無
主表A中有一個從表屬性是B型別的b
主表:
@OneToOne(cascade =CascadeType.ALL)
@JoinColumn(name="主表外來鍵")//這裡指定的是資料庫中的外來鍵欄位。
public B getB(){
return b;
}
從表:無
主表A中有一個從表屬性是B型別的b,同時,從表B中有一個主表屬性是A型別的a
主表:
@OneToOne(cascade =CascadeType.ALL)
@JoinColumn(name="主表外來鍵")//這裡指定的是資料庫中的外來鍵欄位。
public B getB(){
return b;
}
從表:
@OneToOne(mappedBy ="主表類中的從表屬性")
public主表類 get主表類(){
return主表物件
}
單向多對一:多方有一方的引用,一方沒有多方的引用
在多方
@ManyToOne(targetEntity=XXXX.class)//指定關聯物件
@JoinColumn(name="")//指定產生的外來鍵欄位名
雙向多對一:配置方式同雙向一對多
// 示例
// 訂單 Order 和使用者 User 是一個 ManyToOne 的關係
// 在 Order 類中定義
@ManyToOne()
@JoinColumn(name="USER")
publicUser getUser(){
return user;
}
單向一對多:一方有集合屬性,包含多個多方,而多方沒有一方的引用
@OneToMany預設會使用連線表做一對多關聯
新增@JoinColumn(name="xxx_id")後,就會使用外來鍵關聯,而不使用連線表了
雙向一對多:
1)在多方
@ManyToOne
@JoinColumn(name="自己的資料庫外來鍵列名")
2)在一方
@OneToMany(mappedBy="多端的關聯屬性名")
@JoinColumn(name="對方的資料庫外來鍵列名")
- 屬性:
- targetEntity
- 表示多對多關聯的另一個實體類的全名,例如:package.Book.class
- mappedBy
- 用在雙向關聯中,把關係的維護權翻轉。
單向多對多關聯:
在主控方加入@ManyToMany註解即可。
雙向多對多關聯:
兩個實體間互相關聯的屬性必須標記為@ManyToMany,並相互指定targetEntity屬性。
有且只有一個實體的@ManyToMany註解需要指定mappedBy屬性,指向targetEntity的集合屬性名稱。
3.3.2 關聯對映的其他補充
@JoinTable其實同時也是配合@ManyToMany使用的,@ManyToMany註釋表示該物件是多對多關係的一端,然後利用@JoinTable來定義關聯關係(利用中間表來建立聯絡,原因戳這裡),其中name屬性指定中間表名稱,joinColumns定義中間表與該表的外來鍵關係,inverseJoinColumns屬性定義了中間表與另外一端的外來鍵關係。 @JoinTable - 定義關聯表, 該關聯表包含了指回實體表的外來鍵(通過@JoinTable.joinColumns) 以及指向目標實體表的外來鍵(通過@JoinTable.inverseJoinColumns)- e.g.
- 如下表示:該屬性對應欄位為"resource_type",該欄位實際在另外一張名"r_role_x_resource_type"表中,與該表("p_role")通過"role_id"進行外來鍵連結
- (class Role --> table "p_role")
@ElementCollection
@JoinTable(name ="r_role_x_resource_type", joinColumns =@JoinColumn(name ="role_id"))
@Column(name ="resource_type")
@JSONField(serialize =false)
@Cache(usage =CacheConcurrencyStrategy.NONE)
publicList<Class<?extendsResourceable>> getResourceTypeList(){
return resourceTypeList;
}
e.g.
如下表示:關聯的表為“r_role_x_permission",其中關聯外來鍵為"role_id",該表又通過"permission_id"連結第三張表,即目標實體表
(class Role --> table "p_role")
@ManyToMany
@JoinTable(name ="r_role_x_permission", joinColumns =@JoinColumn(name ="role_id"),
inverseJoinColumns =@JoinColumn(name ="permission_id"))
publicList<Permission> getPermissionList(){
return permissionList;
}
4、其他註解
@DiscriminatorValue - 一張表對應一整棵類繼承樹時,該類別對應的“表part”首先參考這篇文章,很重要:hibernate對映繼承關係(一):一張表對應一整棵類繼承樹,從文中可以知道,用一個表來儲存對應的整個類別的資料,比如有Cat和Animal,Cat是Animal的子類,我僅用Animal一個表來儲存Animal和Cat的欄位和資料,而不是分成兩個表。那麼當我進行對映關係的時候,假如我要Cat類對映到Animal中Cat的部分,如何處理?在Animal中定義一個欄位用來區分不同的表,比如Animal表中我額外增加欄位名為Type,那麼在Animal這一張表中,我們本屬於Animal表內容的,該欄位我們設定為animal,本屬於Cat表的,該欄位我們設定為cat。你可以理解為,新增加欄位來用以在同一個表中區分不同類別的內容。 所以對應在註解上的使用的一個對映關係表示,就是這樣的:對於”父類“,即準備用來囊括所有內容的那個表,我們需要定義這個對應的類為 @DiscriminatorColumn(name = "xxx", discriminatorType = DiscriminatorType.xxx) ,這裡的name就是指定表中用來區別各類內容的欄位,而對於”子類“,我們需要註解標明@DiscriminatorValue(xxx),這裡的xxx即對應了父類中的 “區別用欄位” 裡的標識。 舉例來說,就是假如我們希望將Animal和Cat的內容都只儲存在Animal這張表裡,那麼為了區分內容,我們對於Animal這個表新增某欄位如 type;Animal的類,註解為@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING) ,同時設定@DiscriminatorValue("animal");Cat extends Animal,Cat的類,註解為@DiscriminatorValue(“cat");那麼Animal這個表中,欄位type中,為animal的元組對映Animal類,為cat的元組對映Cat類。 而這種方式,多用於資料庫字典概念。
相關推薦
Spring整合Hibernate註解配置 無hibernate.cfg.xml檔案,自動生成表配置
本以為一個無足掛齒的小問題,沒想到還折騰了一下。遂記錄一下。主要搜尋出的結果排名靠前的大多是在hibernate.cfg.xml中的配置方式。與我的環境不符。正確配置方式如下。已測試。 <bean id= "sessionFactor
hibernate註解配置
1、配置對映關係的xml方式 我們知道,Hibernate是一個典型的ORM框架,用以解決物件和關係的不匹配。其思想就是將關係資料庫中表的記錄對映成為物件,以物件形式展現,這樣一來,就可以把對資料庫的操作轉化為對物件的操作。 而ORM一般是採用xml的格式儲存物件與關係資
Hibernate配置(通過註解配置)
註冊 eache 和數 join 主鍵 etom 主鍵生成策略 com per 本文主要講通過註解配置來替換Hibernate的映射文件 1.多對一配置 package com.jazz7.entity; import java.util.Date;
Hibernate中的一對一註解配置
before code uil ransac ges package open cnblogs 一對一 Card類 package cn.OneToOne2017109.entity; import javax.persistence.*; /** * Creat
Hibernate框架學習之註解配置關系映射
target 列名 獲取 fonts 查詢 conn unique strategy code ?????上篇文章我們通過註解對映射了單個實體類,但是具體項目中往往實體類之間又是相互關聯的,本篇文章就是從實體類之間存在的不同關聯角度,具體學習下如何映射他們之間的關聯,主要涉
HIbernate實體類註解配置
一、類級別註解 1、@Entity(name="EntityName") 必選 name為可選,對應資料庫中一的個表 2、@Table(name="",catalog="",schema="") 可選,通常和@Entity配合使用,只能標註在實體的class定義處
Hibernate關聯關係註解配置簡單理解
Hibernate關聯關係註解配置 什麼是關聯關係?關聯關係有哪幾種? 關聯關係指實體之間的關係,也就是表與表之間的關係。一個關係用兩個屬性來描述,數量性和方向性。 從數量上來看,表與表之間主要有三種關係,一對一,一對多,多對多。 加上關係的方向,還有一個多對一。 hibernate中關聯關係的維護
Hibernate 教程(二)[Hibernate物件的操作,xml配置,註解配置]
準備 資料庫建表(Hibernate可以自動生成表,和對應欄位,但是不能給欄位添加註釋,所以選擇手動建表) -- 建立表 CREATE TABLE `Event`( `id` INT AUTO_INCREMENT COMMENT '唯一標識', `title` VARC
hibernate JPA 單表樹形結構 註解配置
public class Category implements java.io.Serializable { @Id @GeneratedValue(strategy=IDENTITY) @Column(name="
hibernate的註解配置
今日工作內容:學習hibernate@Entity //標誌是實體類@Table(name="student")//配置主鍵@Id@GenericGenerator(name="mygenerator" strategy="native")@GeneratedValue(g
Hibernate使用註解配置持久化類
接上篇文章(點選開啟連結),給出Hibernate註解配置持久化類的步驟: 一、同樣配置Hibernate.cfg.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-confi
Spring整合Hibernate和Struts2註解配置檔案
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3
hibernate註解掃描配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-in
Hibernate 繼承的註解配置
三個類的關係是這樣的: BaseObject <- Directory <- Directory 剛開始我在第二個Directory類(稱Directory2)上配置@Entity,用Junit測試,報錯:No identifier specified fo
hibernate模型註解配置guid自動生成方式(非主鍵配置)
package cn.ecgonline.eis.model; /** * 心電資料模型 * * @author linxiang * */ @Entity @Table(name = "ecgs", schema = "dbo", catalog = "JLEISDB") public c
hibernate 註解方式配置實體的對映
Hibernate註解1。@Entity(name="EntityName")必須,name為可選,對應資料庫中一的個表2、@Table(name="",catalog="",schema="")可選,通常和@Entity配合使用,只能標註在實體的class定義處,表示實體
Hibernate中使用JPA(註解)配置物件關係對映
java中註解也是一大特點,平時進行單元測試時我們用過@Test註解進行測試 JPA就是java專門針對持久層框架進行設計的一套規範 JPA:Java Persistence API,其實它也就是一堆介面,就想JDBC一樣,不同的框架只要遵循這同一套規範就可以在java環境
Hibernate多對多中間表有多個欄位欄位的註解配置方式(二)
@Entity@Table(name = "T_STUDENT")@SequenceGenerator(name = "SEQ_STUDENT", sequenceName = "SEQ_STUDENT")public class Student2 implements Serializable { priv
Java註解配置數據庫表主鍵
java gen http 運行 數據庫表 integer rac bsp ber 一 數字類型 Integer @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 運行後就Hiber
Hibernate中配置文件的學習
java itcast 描述 字段 dialect 2.3 map 評論 添加 首先我們看一下hibernate的主配置文件 1 <!DOCTYPE hibernate-configuration PUBLIC 2 "-//Hibernate/Hiber