映射基本属性
映射持久化类的时候,无论它是实体还是可嵌入类型,其所有的属性都会默认认其是可持久化的.用于持久化类的属性默认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会按照原样存储枚举值的标签.