JPA映射持久化對象(Entity)

推薦閱讀:JPA criteria 查詢:類型安全與面向對象

來源: http://blog.sina.com.cn/s/blog_49fd52cf0100rzjn.html

一個普通的POJO類通過@Entity可以映射成爲可持久化的類;
類JavaBean風格:
·類屬性必須爲private;
·有Getter和Setter方法;

映射實體:@Entity
# @Entity實體必須有一個無參的構造方法;
# 實現Serializable接口,建議每一個Entity都實現該接口;
# 其中,Entity中,name屬性表示實體的名稱,比如:
@Entity(name=Contacts)
public class ContactsEO{
...
}
在JPA執行jpql的時候,需要使用Contacts作爲實體名稱,而不是ContactsEO。
String jpql = "select * from Contacts c";
# 如果name沒有配置,則實體名默認爲類名。

可繼承性:
# 實體可繼承,非實體類可以繼承自實體類,實體類也可以繼承自非實體類;
# 抽象類也可以標註爲實體類;

標註主鍵:
# 一個實體類至少要有一個主鍵(Primary Key);
# 使用@Id標註爲實體主鍵;

默認實體映射:
# 一個類標註了@Entity的可持久化類,如果不標註其他任何註釋,該類的屬性和方法自動映射爲數據庫中默認的表和字段。如:
@Entity
public class ContactEO implement Serializable{
    public ContactEO(){}
    private Integer id;
    private String name;
    //getter和setter方法略
}
則該實體默認對應的數據庫表名爲:contacteo,字段爲:int id; varchar name;

映射表和字段:
# @Table註釋可定義映射的表;
# @Column註釋可定義映射到字段;

映射表@Table:
@Target({TYPE}) @Retention(RUNTIME)
public @interface Table{
    String name() default "";
    String catalog() default "";
    String schema() defalut "";
    UniqueConstraint[] uniqueConstraints() default {};
}
# @Table必須標註在類名前;
# name屬性表示實體所對應表的名稱;
# catalog和schema屬性表示實體指定點目錄名稱或數據庫名稱;
# uniqueConstraints屬性表示該實體所關聯的唯一約束條件,一個實體可以有多個唯一約束條件,默認沒有約束;
# 若使用uniqueConstraints標記時,徐奧配合標記UniqueConstraint標記來使用;
示例:
@Entity
@Table(name="contact", schama="jpadb", uniqueConstraints={
    @UniqueConstraint(
        columnNames = {"name", "email"}
    )},
    @UniqueConstraint(
         columnNames = {"other_col_1", "other_col_2"}
    )}
)
# 說明:在註釋中,屬性值是不區分大小寫的。


映射方法和屬性(@Column)
@Column標記表示所持久化屬性所映射表中的字段。
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Column{
    String name() default "";
    boolean unique() default false;
    boolean nullable() default false;
    boolean insertable() default false;
    boolean updateable() default false;
    String columnDefinition() default "";
    String table() defalut "";
    int lenght() default 255;
    int precision() default 0;
    int scale() default 0;
}
# 標記可以標註在Getter方法前或屬性前;
# name爲字段名;
# unique爲字段是否唯一標識,默認爲false;
# nullable爲該字段是否可以爲null值,默認爲true;
# insertable爲使用“INSERT”腳本插入數據時,是否需要插入該字段的值;
# updateable爲使用“UPDATE”腳本更新數據時,是否需要更新該字段的值;
以上兩個多用於只讀屬性,比如主鍵或外鍵等,這些字段通常爲自動生成的。
# columnDefinition表示創建表時,該字段創建的SQL語句,一般用於通過Entity生成表定義時使用;
# table屬性表示當映射多個表時,指定表的表中的字段,默認值爲主表的表名;
# lenght表示字段的長度;
# precision和scale均表示精度;
示例:
@Column(name="contact_name", nullable=false, length=200)
@Column(name="contact_name", nullable=false, columnDefinition="clob not null")

映射優化:
· 基本類型 VS 封裝類型
# 當爲null時,若此時Entity的對應屬性的類型爲int,則將一個null轉換爲int型必定產生轉換異常;但是如果此時Entity屬性類型爲Integer,它是一個對象,對象的值可以爲null,此時不會有問題;
# 建議標註實體的屬性使用Java基本類型的包裝類(這可能會犧牲一些轉換的效率);

· @Basic設置加載方式
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Basic {
    FetchType fetch() default EAGER;
    boolean optional() default true;
}
# 默認Entity的屬性加載方式都是即時加載(EAGER);
# 兩種加載方式:
    LAZY惰性加載
    EAGER即時加載(默認)
示例:@Basic(fetch=FetchType.EAGER)

主鍵映射:
# 主鍵標識@Id
# @GeneratedValue主鍵生成策略:TABLE, SEQUENCE, IDENTITY, AUTO.
    @GeneratedValue(strategy = GenerationType.SEQUENCE  - Oracle
    @GeneratedValue(strategy = GenerationType.IDENTITY  - SQL server
# 生成策略:自增主鍵、表生成器(@TableGenerator)、Sequence生成器(@Sequence)、Identity生成器、複合主鍵(@IdClass)和嵌入式主鍵(@Embeddedld)。
# JPA可定義的生成主鍵策略比較:
    ·SEQUENCE,IDENTITY主要針對一些特殊的數據庫,未確定系統要支持的數據庫類型時,最好不要使用。
    ·AUTO用於比較簡單的主鍵,對主鍵生成策略要求少
    ·TABLE生成策略是將主鍵的值持久化在數據庫的表中,因爲只要是關係型數據庫,都可以創建一個表,專門來保存生成的值,這樣就消除了數據庫之間的不兼容性,既能保證支持多種數據庫,又有一定的靈活性,建議使用。
    ·如果以上方法不能滿足需求時,可以通過一定的規則來設置主鍵的值,可以使用UUID,使其在程序中自動生成,然後映射到實體的主鍵上,不能通過JPA的主鍵生成策略來實現。

示例:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)

映射特殊類型:
· 映射Blob和Clob類型(@Lob)
# Blob和Clob類型都可以通過@Lob屬性來標註(text類型字段也可以用該屬性標註);
# Clob(Character Large Object)類型是長字符串類型,映射到爲實體中的類型可以爲char[]、Charater[]或者String類型;
# Blob(Binary Large Object)類型是字節類型,映射爲實體中的類型可爲byte[]、Byte[]或者實現了Serializable接口的類;
# 因爲上述兩種類型的數據一般佔用內存比較大,因此通常使用惰性加載;

· 映射時間(Temporal)類型(@Temporal)
# 時間日期類型,需要用@Temporal來標註;
# TemporalType枚舉類型定義爲:DATE, TIME, TIMESTAMP;默認爲TemporalType.TIMESTAMP;

· 映射枚舉(Enumerated)型
# 通過@Enumerated類標註枚舉類型;
# 使用@Enumerated時需要注意:
    枚舉類型有兩個屬性:名稱和值。通過EnumType來定義:ORDINAL, STRING
    ORDINAL表示持久化的爲枚舉類型的值;STRING表示持久化的爲枚舉類型的名稱;
# 建議使用ORDINAL類型來持久化枚舉類型;
# 枚舉類型的定義位置(實體內部或外部)根據具體情況而定。

· 映射非持久化類型(@Transient)
# 如果實體中有屬性或者Getter方法並不需要持久化,則需要使用@Transient來標註。

關注公衆號,分享乾貨,討論技術


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章