JPA之@entity、@Table、@Column、@Id
技術標籤:JAVA
在JPA中有一種這種定義,可以將普通的java物件對映到資料庫。這種普通物件被稱為Entity Bean。
這種entity Bean物件除了有一些註釋之外,和普通的java類沒有任何區別。
建立一個Entity Bean物件相當於新建一條記錄,刪除一個Entity Bean會同時從資料庫中刪除對應記錄,修改一個Entity Bean時,容器會自動將Entity Bean的狀態和資料庫同步。
—@Entity
必須與@Id註解結合使用,否者會No identifier specified for entity:
@Entity 說明這個 class 是實體類,並且使用預設的 orm 規則,即 class 名即資料庫表中表名,class 欄位名即表中的欄位名。@Entity 註解指名這是一個實體 Bean。
@Entity
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private Long id;
private String name;
private int age;
private String addree;
}
如果沒有 @javax.persistence.Entity 和 @javax.persistence.Id 這兩個註解的話,它完全就是一個典型的 POJO 的 Java 類,現在加上這兩個註解之後,就可以作為一個實體類與資料庫中的表相對應。
**實體類必須用 @javax.persistence.Entity 進行註解;如果不用這個註解會報 Error creating bean with name ‘entityManagerFactory’ defined in class path resource:@OneToOne or @ManyToOne 異常
**必須使用
@javax.persistence.Id 來註解一個主鍵;如果沒有這個註解會報:No identifier specified for entity 異常
**實體類必須
擁有一個 public 或者 protected 的無參建構函式,否則會報錯:
No default constructor for entity:
@Entity
public class UserEntity{...} 表名 user_entity
@Entity(name="UE")
public class UserEntity{...} 表名 ue
@Entity(name="UsEntity")
public class UserEntity{...} 表名 us_entity
-**
[email protected]:
**
@Table 註解是一個非必須的註解。@Table 註解指定了 Entity 所要對映帶資料庫表,其中 @Table.name() 用來指定對映表的表名。宣告此物件對映到資料庫的資料表,通過它可以為實體指定表(talbe),目錄 (Catalog) 和 schema 的名字。
如果同時使用了 @Entity(name=“student”) 和 @Table(name=“students”),最終的對應的表名必須是哪個?答案是 students,這說明優先順序:@Table > @Entity。
@Id
@Id 標註用於宣告一個實體類的屬性對映為資料庫的主鍵列。該屬性通常置於屬性宣告語句之前,可與宣告語句同行,也可寫在單獨行上。
@Id標註也可置於屬性的getter方法之前。
@GeneratedValue
@GeneratedValue 用於標註主鍵的生成策略,通過strategy 屬性指定。預設情況下,JPA 自動選擇一個最適合底層資料庫的主鍵生成策略:SqlServer對應identity,MySQL 對應 auto increment。
在javax.persistence.GenerationType中定義了以下幾種可供選擇的策略:
–IDENTITY:採用資料庫ID自增長的方式來自增主鍵欄位,Oracle 不支援這種方式;
–AUTO: JPA自動選擇合適的策略,是預設選項;
–SEQUENCE:通過序列產生主鍵,通過@SequenceGenerator 註解指定序列名,MySql不支援這種方式
–TABLE:通過表產生主鍵,框架藉由表模擬序列產生主鍵,使用該策略可以使應用更易於資料庫移植。
@GeneratedValue註解有兩個屬性,分別是strategy和generator,
generator:主鍵生成的來源,既由誰來執行生成主鍵,從哪裡獲取主鍵值。下面會講到mybatis可以配置的值。
@TableGeneratedor
用途:將當前主鍵的值單獨儲存到資料庫的一張表裡去,主鍵的值每次都是從該表中查詢獲得,適用於任何資料庫,不必擔心相容問題。
舉個栗子:
@Id
@Column(name = "id")
@TableGenerator(name = "hf_opert_id_gen", //此處的名字要和下面綠色標註的對應
table = "mcs_hibernate_seq", //主鍵儲存到資料庫的表名
pkColumnName = "sequence_name", //表裡用來儲存主鍵名字的欄位
valueColumnName = "sequence_next_hi_value",//表裡用來儲存主鍵值的欄位
pkColumnValue = "user_id", //表裡名字欄位對應的值
allocationSize = 1)//自動增長,設定為1
@GeneratedValue(strategy = GenerationType.TABLE, generator = "hf_opert_id_gen")
private Integer id;
@TableGenerator(
name="TableGenerator", //生成器名稱
table="jdp_keys", //指定表名
pkColumnName="KEYID", //Primary key Column Name 表示在持久化表中,該主鍵生成策略所對應鍵值的名稱 字串型別
valueColumnName="KEYVALUE", //表示在持久化表中,該主鍵當前所生成的值 整型
pkColumnValue="REPORT_ACTIVITY_ID", //主鍵名稱,這裡直接用了表名
allocationSize=1 //每次主鍵值增加的大小
@TableGenerateor 屬性中的 table :
可以利用select * from table名字;
查出資料庫中keyID 和 KeyValue(主鍵個數)的資訊。
以看出 pkColumnName=“KEYID”
pkColumnValue=“馬賽克”
valueColumnName=“KEYVALUE”
@Column
name
定義了被標註欄位在資料庫表中所對應欄位的名稱;
unique
表示該欄位是否為唯一標識,預設為false。如果表中有一個欄位需要唯一標識,則既可以使用該標記,也可以使用@Table標記中的@UniqueConstraint。
nullable
表示該欄位是否可以為null值,預設為true。
insertable
表示在使用“INSERT”指令碼插入資料時,是否需要插入該欄位的值。
updatable
表示在使用“UPDATE”指令碼插入資料時,是否需要更新該欄位的值。insertable和updatable屬性一般多用於只讀的屬性,例如主鍵和外來鍵等。這些欄位的值通常是自動生成的。
columnDefinition(大多數情況,幾乎不用)
表示建立表時,該欄位建立的SQL語句,一般用於通過Entity生成表定義時使用。(也就是說,如果DB中表已經建好,該屬性沒有必要使用。)
table
表示當對映多個表時,指定表的表中的欄位。預設值為主表的表名。
length
表示欄位的長度,當欄位的型別為varchar時,該屬性才有效,預設為255個字元。
precision和scale
precision屬性和scale屬性表示精度,當欄位型別為double時,precision表示數值的總長度,scale表示小數點所佔的位數。
1: 指定欄位“tradeNo”交易編號的長度為50,且值不能為null
@Column(name = "tradeNo", length = 50, nullable = false)
private String tradeNo;
2:指定欄位“totalAmount”交易金額的精度(長度)為10,小數點位數為2位,且值不能為null
@Column(name = "totalAmount", precision = 10, scale = 2, nullable = false)
private BigDecimal totalAmount;
3: 欄位“text”,指定建表時SQL語句 如“varchar(50) NOT NULL”
@Column(name = "text", columnDefinition = "varchar(50) not null")
private String text;
4:欄位值為只讀的,不允許插入和修改。通常用於主鍵和外來鍵
@Column(name = "id", insertable = false, updatable = false)
private Integer id;
持續更新。。。