1、類級別註解mysql
1. Hibernate註解簡介sql
使用註解的目的:爲了簡化繁瑣的ORM映射文件(*.hbm)的配置數據庫
2. JPA與Hibernate的關係服務器
JPA,全稱Java Persistence API,JPA註解是JAVAEE的標準和規範session
JPA和Hibernate的關係:JPA是標準接口,Hibernate是實現,可是其功能是JPA的超集app
Hibernate經過hibernate-annotation、hibernate-entitymanager和hibernate-core三個組件來實現JPA框架
通常在實際開發中,優先考慮使用JPA註解,這樣更有利於程序的移植和擴展ide
3. Hibernate註解分類工具
類級別註解fetch
屬性級別註解
映射關係註解
4.類級別註解:
@Entity--實體類註解
@Table--表註解
@Embeddable--嵌入類註解
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <property name="hibernate.current_session_context_class">thread</property> </session-factory> </hibernate-configuration>
@Entity註解——映射實體類
@Entity(name=「tableName」)
name:可選,對應數據庫中的一個表。若表名與實體類名相同,則能夠省略
注意:使用@Entity時必須指定實體類的主鍵屬性,用@Id在主鍵屬性的get方法上註解。
@Table(name=「」,catalog=「」,schema=「」)
與@Entity配合使用,只能標註在實體的class定義處,表示實體對應的數據庫表的信息
name:可選,映射表的名稱,默認代表與實體名稱一致,只有在不一致的狀況下才須要指定表名
catalog:可選,表示Catalog名稱,默認爲Catalog(「」)
schema:可選,表示Schema名稱,默認爲Schema(「」)
Catalog:將遠程或本地的數據庫服務器中的實例或庫映射到用戶主機,以方便用戶執行各類操做。
Schema:數據庫對象的集合,一個用戶通常對應一個schema。
能夠把它們理解爲一個容器或者數據庫對象命名空間中的一個層次,主要用來解決命名衝突問題.
catalog爲目錄,schema爲模式.
從概念上說,一個數據庫系統包含多個Catalog,每一個Catalog又包含多個Schema,而每一個Schema又包含多個數據庫對象(表、視圖、字段等),反過來說一個數據庫對象必然屬於一個Schema,而該Schema又必然屬於一個Catalog. 這樣咱們就能夠獲得該數據庫對象的徹底限定名稱從而解決命名衝突的問題了
例如數據庫對象表的全限定名稱就能夠表示爲:Catalog名 稱.Schema名稱.表名稱.
不一樣數據庫對schema、catalog的支持不一樣.
@Embeddable
1.@Embeddable表示一個非Entity類能夠嵌入到另外一個Entity類中做爲屬性而存在。
2.@Embeddable不生成獨立的表,能夠理解@Embeddable註解類爲屬性集。
2、屬性級別註解
1.屬性級別註解
@Id
@SequenceGenerator
@GeneratedValue
@Column
@Embedded
@EmbeddedId
@Lob
@Version
@Basic
@Transient
2.添加方式
一是寫在屬性字段上面
二是寫在屬性的get訪問器的上面
@Id
必須,定義了映射到數據庫表的主鍵的屬性,一個實體類能夠有一個或者多個屬性被映射爲主鍵,可置於主鍵屬性或者getXxxx()前
注意:若是有多個屬性定義爲主鍵屬性,該實體類必須實現serializable接口
注意:將 String類型的屬性設置成主鍵是必定要指定該屬性的長度,能夠用@Column(length=8)註解來指定,否則MySQL會默認讓其長度爲255,而MySQL主鍵的長度不容許太長。
@GeneratedValue註解
@GeneratedValue註解與@Id註解一塊兒使用,用於定義主鍵的生成策略. 包含兩個屬性strategy(主鍵生成策略)、generator(主鍵生成器)
strategy能夠取:
1.GenerationType.AUTO:根據底層數據庫自動選擇(默認)
2.GenerationType.INDENTITY:根據數據庫的Identity字段生成.
3.GenerationType.SEQUENCE:使用Sequence(序列)來決定主鍵的取值.
4.GenerationType.TABLE:使用指定的表來決定主鍵的取值 (結合某些表來實現,必須與@TableGenerator註解一塊兒使用).
如:@Id
@GeneratedValue(strategy=GenerationType.TABLE)
@TableGenerator(name="tab_cat_gen",allocationSize=1)
generator表示主鍵生成器的名稱,這個屬性一般與ORM框架相關。例如Hibernate能夠指定uuid等主鍵生成方式
如:@Id
@GeneratedValue(generator="sid")
@GenericGenerator(name="sid", strategy="assigned")
@Column(length=8)
@Column
可將屬性映射到列,使用該註解來覆蓋默認值,@Column描述了數據庫表中該字段的詳細定義,這對於根據JPA註解生成數據庫表結構的工具很是有用
經常使用屬性:
name:可選,表示數據庫表中該字段的名稱,默認情形屬性名稱一致;
nullable:可選,表示該字段是否容許爲null,默認爲true;
unique:可選,表示該字段是不是惟一標識,默認爲false;
length:可選,表示該字段的大小,僅對String類型的字段有效,默認值255(若是是主鍵,不能使用默認值);
insertable:可選,表示在ORM框架執行插入操做時,該字段是否應出如今INSERT語句中,默認爲true;
updateable:可選,表示在ORM框架執行更新操做時,該字段是否應出如今UPDATE語句中,默認爲true,對於一經建立就不能修改的字段,該屬性很是有用,如對於birthday字段。
@Embedded
註釋屬性,表示該屬性的類是嵌入類
注意:同時嵌入類也必須標註@Embeddable
@EmbeddedId:
@EmbeddedId使用嵌入式主鍵類實現複合主鍵。
注意:嵌入式主鍵類必須實現Serializable接口、必須有默認的public無參數的構造方法、必須覆蓋equals和hashCode方法。
@Transient:
可選,表示該屬性並不是一個到數據庫表的字段的映射,ORM框架將忽略該屬性,若是一個屬性並不是數據庫表的字段映射,就務必將其標示爲@Transient,不然ORM框架默認其註解爲@Basic。
3、關聯映射註解
實體之間的映射關係
一對一:一個公民對應一個身份證號碼
一對多(多對一):一個公民有多個銀行賬號
多對多:一個學生有多個老師,一個老師有多個學生。
一、一對一單向外鍵關聯
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="pid", unique=true) 參數name爲被控類主鍵,主控類的外鍵,unique標識該主鍵惟一
注意:保存時應先保存外鍵對象,再保存主表對象
2.一對一雙向外鍵關聯
單向外鍵主控類對於被控類透明。主控類知道被控類。雙向外鍵主被控類雙方都知道
一對一雙向:在一對一單向基礎上,在被控類中添加主控類的對象,而且添加@OneToOne註解,且該註解的屬性mappedBy必須設置,設置成主控類中被控類的對象。
@OneToOne(MappedBy="xx") 其中xx是主控類中被控類的對象名字
雙向關聯必須設置mappedBy屬性,由於雙向關聯只能交給一方去控制,不可能在雙方都設置外鍵保存關聯關係,不然雙方都沒法保存
3.一對一單向外鍵聯合主鍵
1.建立主鍵類
2.主鍵類必須實現Serializable接口,重寫hasCode()和equals()方法
3.主鍵類用@Embeddable註解,實體類屬性用@EmbeddedId註解,可參考以前的內容
4.多對一單向外鍵關聯
@ManyToOne(cascade={CasCadeType.ALL}, fetch=FetchType.EAGER)
@JoinColumn(name="rid", referencedColumnName="cid")
//name=定義外鍵在本表的字段名 referencedColumnName=關聯外鍵對象的哪一個字段
5.一對多單向外鍵關聯
不管使用一對多仍是多對一,外鍵字段都是存在多方的表當中.
@OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name="cid"); //指定外鍵名字
總結:使用多對一時,多方的抓取策略fetch通常設置爲EAGER、一方設置爲LAZY.
當使用單向的一對多關聯時,要先保存多方的數據再保存一方的數據.外鍵存在多方表中.
6.一對多(多對一)雙向外鍵關聯
多方:多方持有一方的引用
@ManyToOne(cascade={CasCadeType.ALL}, fetch=FetchType.EAGER)
@JoinColumn(name="cid")
一方:一方持有多方的集合
@OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY)
@JoinColumn(name="cid");
7.多對多單向外鍵關聯
保存時先保存被控方,由於是學生主控方,因此對方先保存,再本身(主控方)保存。【在單向的狀況下,雙向就無需糾結這個問題】
八、多對多雙向外鍵關聯
@ManyToMany(mappedBy="teachers")——將主控方交給學生來處理,不少人誤認爲是交給老師來處理。
9.總結
a) 只有OneToOne,OneToMany,ManyToMany上纔有mappedBy屬性,ManyToOne不存在該屬性;
b) mappedBy標籤必定是定義在the owned side(被擁有方的),他指向theowning side(擁有方);
c) 關係的擁有方負責關係的維護,在擁有方創建外鍵。因此用到@JoinColumn;
d)mappedBy跟JoinColumn/JoinTable老是處於互斥的一方