Hibernate笔记(映射值类型)

映射基本属性

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 本文中我们介绍并比较两种最流行的开源持久框架:iBATIS和Hibernate,我们还会讨论到Java Persi...
    大同若鱼阅读 4,345评论 4 27
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,671评论 0 4
  • Hibernate中配置主要分为两种:一种包含了Hibernate与数据库的基本连接信息,在Hibernate工作...
    FTOLsXD阅读 2,152评论 0 10
  • 1晨间日记的奇迹 一写晨间日记不超过3分钟,因为简单,就容易养成习惯。如果有很多事情写,可以晚点补写。 二每养成一...
    勤勤囡阅读 265评论 0 0