1. 程式人生 > 其它 >JPA之@entity、@Table、@Column、@Id

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;

持續更新。。。