程序员

Hibernate笔记(映射值类型)

2017-09-05  本文已影响56人  Captain_w

映射基本属性

映射持久化类的时候,无论它是实体还是可嵌入类型,其所有的属性都会默认认其是可持久化的.用于持久化类的属性默认JPA规则:

重写基本属性的默认值

@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会按照原样存储枚举值的标签.

上一篇 下一篇

猜你喜欢

热点阅读