上一篇學習了JPA的helloworld,也初略的使用了一些注解,接下來就細細的了解一下有哪些注解,和這些注解的作用
JPA的基本注解:
①@Entity,@Table,@Id,@GeneratedValue,@Column,@Basic,這些是最基本的注解了
一:@Entity: 標注用于實體類聲明語句之前,指出該java 類為實體類,將映射到指定的數據庫表。如聲明一個實體類 User,它將映射到數據庫中的 user 表上。如果沒有使用@Table注解的話,那么vo的名稱是什么,那么相應的數據表的名稱也是vo的名稱。
二:@Table:當實體類與其映射的數據庫表名不同名時需要使用 @Table 標注說明,該標注與 @Entity 標注并列使用,置于實體類聲明語句之前,可寫于單獨語句行,也可與聲明語句同行。 @Table 標注的常用選項是 name,用于指明數據庫的表名 @Table標注還有一個兩個選項 catalog 和 schema 用于設置表所屬的數據庫目錄或 模式,通常為數據庫名。uniqueConstraints 選項用于設置約束條件,通常不須設置。
三:@Id 標注用于聲明一個實體類的屬性映射為數據庫的主鍵列。該屬性通常置于屬性聲明語句之前,可與聲明語句同行,也可寫在單獨行上。 @Id標注也可置于屬性的getter方法之前。
四:@GeneratedValue 用于標注主鍵的生成策略,通過 strategy 屬性指定。默認情況下,JPA 自動選擇一個最適合底層數據庫的主鍵生成策略:SqlServer 對應 identity,MySQL 對應 auto increment。 在 javax.persistence.GenerationType 中定義了以下幾種可供選擇的策略: IDENTITY:采用數據庫 ID自增長的方式來自增主鍵字段,Oracle 不支持這種方式; AUTO: JPA自動選擇合適的策略,是默認選項; SEQUENCE:通過序列產生主鍵,通過 @SequenceGenerator 注解指定序列名,MySql 不支持這種方式 TABLE:通過表產生主鍵,框架借由表模擬序列產生主鍵,使用該策略可以使應用更易于數據庫移植。
五:@Basic 表示一個簡單的屬性到數據庫表的字段的映射,對于沒有任何標注的 getXxxx() 方法,默認即為@Basic fetch: 表示該屬性的讀取策略,有 EAGER 和 LAZY 兩種, 分別表示主支抓取和延遲加載,默認為 EAGER. optional:表示該屬性是否允許為null, 默認為true
@Transient:
表示該屬性并非一個到數據庫表的字段的映射,ORM框架將忽略該屬性. 如果一個屬性并非數據庫表的字段映射,就務必將其標示為@Transient,否則,ORM框架默認其注解為 @Basic
@Temporal
在核心的 Java API 中并沒有定義 Date 類型的精度(temporal PRecision). 而在數據庫中,表示 Date 類型的數據有 DATE, TIME, 和 TIMESTAMP 三種精度(即單純的日期,時間,或者兩者 兼備). 在進行屬性映射時可使用@Temporal注解來調整精度.
@Table這個注解就比較多的內容了
這個注解的的意思就是說主鍵生成策略是放在一個數據表中,每次使用的時候,就在數據表中查詢,根據自己設置的策略,來生成主鍵。
我在mysql數據庫中創建了:
,數據表,PK_NAME存放的就是我們哪一個表使用的策略,ID_VAL存放的就是主鍵,每次我們創建的記錄的時候,主鍵就是使用ID_VAL作為參照.下面就是我存放的記錄,
我現在的注解是:
package com.hotusm.commom.entity;import java.io.Serializable;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;import javax.persistence.TableGenerator;@Table(name="USER")@Entitypublic class User implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private Integer id; private String name; private String userDesc; @TableGenerator(name="GENERATORS",//名稱 需要和@GeneratedValue中的generator值一樣 table="ID_GENERATOR",//對應我們創建的主鍵策略數據表的表名 pkColumnName="PK_NAME",//對應創建的主鍵策略數據表存放信息的那個字段,和后面pkColumnValue一起就可以確定一行 pkColumnValue="ID_USER",//這個字段是PK_NAME的值 valueColumnName="ID_VAL",//由pkColumnName,pkColumnValue可以確定一行,由這個就可以確定是哪一個字段了 allocationSize=1,//每次主鍵增長的大小ID_VAL剛開始設置了,那么就不起作用 initialValue=1//初始化的大小,如果數據表中的 ) @GeneratedValue(strategy=GenerationType.TABLE,generator="GENERATORS") @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name="user_desc") public String getDesc() { return userDesc; } public void setDesc(String desc) { this.userDesc = desc; } }
這樣,我們每次創建表的時候,主鍵就能夠根據我們設置的策略進行增長了,但是這種方式不是很常用的,除非是一些特定的業務需求。
新聞熱點
疑難解答