美文网首页程序员
Hibernate笔记(映射值类型)

Hibernate笔记(映射值类型)

作者: Captain_w | 来源:发表于2017-09-05 18:01 被阅读56次

映射基本属性

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

相关文章

  • Hibernate笔记(映射值类型)

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

  • Heibernate学习

    Heibernate学习 Hibernate 映射类型 映射类型 当你准备一个 Hibernate 映射文件时,我...

  • Hibernate映射类型篇

    一、 Java类型 -Hibernate映射关系文件中,配置属性和字段关系时,可以在type属性上指定Java类型...

  • golang实战笔记

    golang实战笔记 一、集合类型 1.值指针和引用类型a、go语言变量持有相应的值,列外:通道、函数、方法、映射...

  • Kotlin从0到1——Java<>Kotlin数据类型映射表

    原子类型映射表: 原子包装类型映射表(以?结尾的类型,表示该值可以是 空(null)值): 非原子类型映射表: 数...

  • Hibernate数据持久化之集合的关联映射配置(08)

    Hibernate的关联映射 一 .关联映射的主要内容 1.1 关联映射的使用 普通类型的集合使用:例子,一个用户...

  • Hibernate学习(配置文件详解)

    Hibernate映射配置文件(重点) 映射配置文件名称和位置没有固定要求 映射配置文件中,标签name属性值写实...

  • Hibernate映射文件详解

    类名.hbm.xml 关系映射配置文件 hibernate、java、标准sql数据类型对照表 即映射文件中 标签...

  • 映射、函数

    1、映射 映射将键映射到值。映射的零值为nil。nil映射既没有键,也不能添加键。make函数会返回给定类型的映射...

  • tips of c#

    基础类型的大小是固定,因为会被映射成内部类型 可空值类型, 可空值类型不能赋值给普通的值类型 ref 参数 用来传...

网友评论

    本文标题:Hibernate笔记(映射值类型)

    本文链接:https://www.haomeiwen.com/subject/lntpjxtx.html