映射基本屬性
映射持久化類的時候,無論它是實體還是可嵌入類型,其所有的屬性都會默認認其是可持久化的.用于持久化類的屬性默認JPA規則:
- 如果屬性是基本單元或者包裝類型.或者是String,BigInteger,BigDecimal,java.util.Date,java.util.Calendar,java.sql.Date,java.sql.Time,java.sql.Timestamp,byte[],Byte[],char[]或Character[]類型.則它會被自動持久化,HIbernate會在具有合適的SQL類型且名稱與屬性名稱相同的列中加載和存儲信息
- 如果將屬性的類注解為@Embeddable,或者將屬性本身映射為@Embedded,則HIbernate會將該屬性映射為所屬類的可嵌入組件,
- 如果屬性的類型是java.io.Serializable,則它的值會以其序列化格式存儲.
- HIbernate會在啟動時拋出一個異常.提示它不理解該屬性的類型.
重寫基本屬性的默認值
@Column 如下面代碼:
@Column(nullable = false, name = "initial_price")
private BigDecimal initialPrice;
name 數據庫字段名稱.nullable 是否可以為null 還有很多屬性,注釋很通俗易懂
使用派生屬性
派生屬性的值是在運行時通過估算由@org.hibernate.annotations.Fprmula 注解聲明的SQL表達式來計算的;
@org.hibernate.annotations.Formula(
"substr(description,1,12) || '...'"
)
private String shortDescription;
@org.hibernate.annotations.Formula(
"(select avg(b.amount) from t_bid b where b.item_id = id)"
)
private BigDecimal averageBidAmount;
指定的SQL公式會在每次從數據庫檢索Item實體時估算,其他任何時候都不會估算,如果其他屬性被修改了.則結果可能會過期,這些數據絕不會出現在SQL的INSERT或者UPDATE語句中,只會出現在SELECT語句中,估算發生在數據庫中的,在加載實例時,HIbernate會在SELECT子句中嵌入SQL公式.
轉換列值
假設有一個名為imperial_weight的數據庫列,他會以磅為單位存儲item的重量,不過,應用程序有一個以千克為單位的Item@metricWeight屬性.所以從Item表讀取以及向該表寫入行時必須轉換該數據庫列的值.可以使用一個HIbernate拓展來實現該轉換.
@Column(name = "imperial_weight")
@org.hibernate.annotations.ColumnTransformer(
read = "imperial_weight / 2.20462",
write = "? * 2.20462"
)
private double metricWeight;
生成的以及默認的屬性值
數據庫有時候生成屬性值,通常是在首次插入行時,數據庫生成的值的例子包含創建時間戳.商品的默認價格以及為每次修改所運行的觸發器.
@Temporal(TemporalType.TIMESTAMP)
@Column(insertable = false, updatable = false)
@org.hibernate.annotations.Generated(
GenerationTime.ALWAYS
)
private Date lastModified;
@Column(insertable = false)
@org.hibernate.annotations.ColumnDefault("1.00")
@org.hibernate.annotations.Generated(
GenerationTime.INSERT
)
private BigDecimal initialPrice;
GenerationTime 的可用設置是ALWAYS,INSERT.
使用ALWAYS,HIbernate還在每次執行SQL的UPDATE或INSERT語句之后刷新實體實例,示例假定數據庫觸發器會保存當前的lastModified屬性.還應該使用column的updatable和insertable參數將該屬性標記為只讀,如果這兩者設置為false,則該屬性的列將永遠不會出現在INSERT或UPDATE語句中.并且要讓數據庫生成其值.
使用INSERT 刷新將值發生在SQL INSERT語句之后,以檢索由數據庫提供的默認值.HIbernate還會將該屬性映射為非insertable.@ColumnDefault HIbernate注解會在HIbernate導出和生成SQL架構DDL時設置列的默認值.
映射枚舉
枚舉類型是一個常用的java習慣用語,它指的是類具有恒定(較少)數量的不可變實例.例如下面代碼:
public enum AuctionType {
HIGHEST_BID,
LOWEST_BID,
FIXED_PROCE
}
@NotNull
@Enumerated(EnumType.STRING)
private AuctionType auctionType = AuctionType.HIGHEST_BID;
不使用@Enumerated注解.Hibernate會存儲指的ORDINAL位置,也就是說為HIGHEST_BID存儲1,LOWEST_BID存儲2,FIXED_PROCE存儲3.這是一個脆弱的默認設置,如果對AuctionType枚舉變更.則現有的值可能就不在映射到相同位置.因此,EnumType.STRING選項是一個更好的選擇,Hibernate會按照原樣存儲枚舉值的標簽.