Hibernate註解(一)之持久化實體

茅坤寶駿氹發表於2018-05-24

翻譯自   Hibernate Annotations

1. 建立POJO作為持久化實體

每個持久化POJO類都是一個實體,並使用 @Entity註解(在類級別)宣告:

@Entity
public class Flight implements Serializable {
    Long id;

    @Id
    public Long getId() { return id; }

    public void setId(Long id) { this.id = id; }
}    

@Entity將該類宣告為一個實體(即一個持久的POJO類),@Id宣告該實體的識別符號屬性。其他對映宣告是隱式的。類Flight被對映到Flight表,使用列ID作為其主鍵列。


注意:JPA規範的核心是異常配置的概念。

根據是否註釋欄位或方法,Hibernate使用的訪問型別將為field或 property。EJB3規範要求您對將要訪問的元素型別宣告註釋,例如,如果使用property訪問許可權,則使用getter方法;如果使用訪問許可權,則使用該欄位field。應該避免在兩個欄位和方法中混合註釋。Hibernate會從@Idor 的位置猜測訪問型別@EmbeddedId。


1.1. 定義表格

@Table被設定在課堂級別; 它允許您為實體對映定義表,目錄和模式名稱。如果no @Table定義,則使用預設值:實體的非限定類名稱。

@ Entity 
@ Table (name = “tbl_sky” )
public class Sky implements Serializable { ... }     

該@Table元素包含一個 schema和catalog屬性,如果它們需要被定義。您還可以使用@UniqueConstraint註釋連同@Table(為了繫結到單個列的唯一約束,建議使用該 @Column.unique方法(參考以@Column獲取更多資訊))來 為表定義唯一約束。

@ Table (name = “tbl_sky” ,
    uniqueConstraints  = { @ UniqueConstraint (columnNames = { “month” ,“day” })} ) 
一個唯一的約束被應用到元組month,day。請注意該columnNames陣列引用邏輯列名稱。

邏輯列名由Hibernate NamingStrategy實現定義 。預設的JPA命名策略使用物理列名稱作為邏輯列名,但如果您使用自定義NamingStrategy 實現將fld_附加到所有列中,它可能會有所不同。請注意,當明確設定列名稱時,邏輯列名稱不一定等於屬性名稱esp。除非你重寫NamingStrategy,否則你不應該擔心。


1.2.  版本控制樂觀鎖定

您可以使用@Version註釋向實體新增樂觀鎖定功能 :

@Entity
public class Flight implements Serializable {
...
    @Version
    @Column(name="OPTLOCK")
    public Integer getVersion() { ... }
}   

        版本屬性將被對映到 OPTLOCK列,實體管理器將使用它來檢測衝突更新(防止丟失的更新,否則您可能會看到上次提交 - 贏取策略)。
     版本列可以是數字(推薦的解決方案)或時間戳。Hibernate支援任何種類的型別,只要你定義並實現適當的 UserVersionType。
        應用程式不得以任何方式更改由Hibernate設定的版本號。要人為增加版本號,請檢視Hibernate Entity Manager的參考文件 LockModeType.OPTIMISTIC_FORCE_INCREMENT或 LockModeType.PESSIMISTIC_FORCE_INCREMENT。








相關文章