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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容

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