【SSH进阶之路】【四】hibernate5 实体映射注解配置 【1】注解全面解析

相对于经典风格的实体配置xxx.hbm.xml,新版本hibernate使用JPA(Java Persistence API)注解配置能使我们的开发更加敏捷便利.在本系列前面部分的文章中,我们围绕JPA注解风格配置来逐步深入学习。

配置实例

下面先看一个实体类的配置实例:

package com.chenhao.hibernate.model;

import java.util.Date;

import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;


/**
 * 
 * @author chen_hao
 *
 */

@Entity//声明当前类为hibernate映射到数据库中的实体类
@Table(name = "t_user")//声明在数据库中自动生成的表名为t_user
public class User {


    @Id//声明此列为主键
    /**
     *  @GeneratedValue注解来定义生成策略
     *  GenerationType.TABLES 当前主键的值单独保存到一个数据库的表中
     *  GenerationType.SEQUENCE  利用底层数据库提供的序列生成标识符
     *  GenerationType.IDENTITY 采取数据库的自增策略
     *  GenerationType.AUTO 根据不同数据库自动选择合适的id生成方案,这里使用mysql,为递增型
     */
    @GeneratedValue(strategy = GenerationType.AUTO)//根据不同数据库自动选择合适的id生成方案,这里使用mysql,为递增型
    private Integer id;
    @Column(insertable = true,length = 20,nullable = false,name = "name",unique = true,updatable = true)
    private String name;

    @Basic(fetch = FetchType.EAGER,optional = true)
    private Integer age;


    @Column(scale = 1,precision = 1)
    private Double salary;


    /**
     * @Basic 基本属性类型映射,注解于非Static 非transient的属性,
     * 这时候我们可以为其声明抓取策略等属性
     * fetch: 获取策略,当以session.get()方法获取数据库对象时:
     *   fetchType.LAZY为懒加载,会在第一次使用该属性(如调用getAge()方法)时才获取。
     * FetchType.EAGER为即时加载。
     * optional:表示当前属性是否可选,默认为true,如果为false,则在持久化到数据库时,如果此属性为null,则会失败
     */
    @Basic(fetch = FetchType.EAGER,optional = true)
    @Transient//被标注此注解的属性不会被持久化到数据库
    private String temp;

    /**
     * @Lob 注解表示属性将被持久化为Blob或者Clob类型, 
     * 具体取决于属性的类型, java.sql.Clob, Character[], char[] 和 java.lang.String这些类型的属性都被持久化为Clob类型, 
     * 而java.sql.Blob, Byte[], byte[] 和 serializable类型则被持久化为Blob类型.
     */

    @Lob
    @Basic(fetch = FetchType.LAZY)
    @Column(columnDefinition = "BLOB", nullable = true)
    private String desc;

    /**
     * @Temporal  标注在日期等属性上,声明映射为数据库的特定诶其属性类型,默认为java.sql.Timestamp(TemporalType.TIMESTAMP)
     *  此外还有java.sql.date(TemporalType.DATE)、java.sql.Time(TemporalType.TIME)
     */
    @Temporal(TemporalType.TIME)
    private Date birthDate;



    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }





}

在实例中,我们使用了一些常用的注解属性,并配上注释进行了细致说明

拓展分析

除了上面注释的说明,我们还需要补充的说明是

1. @Column常用属性解析

属性名说明默认值
unique可选,是否在该列上设置唯一约束false
nullable可选,是否设置该列的值可以为空false
insertable可选,该列是否作为生成的insert语句中的一个列true
updatable可选,该列是否作为生成的update语句中的一个列true
columnDefinition可选: 为这个特定列覆盖SQL DDL片段 (这可能导致无法在不同数据库间移植)比如我们想把Integer readNum 设为默认0,可使用此属性: INT DEFAULT 0
table可选,定义对应的表默认为当前类对应表
length可选,列长度255
precision可选,列十进制精度(decimal precision)0
scale可选,如果列十进制数值范围(decimal scale)可用,在此设置0

如果某属性没有注解,该属性将遵守下面的规则:

  1. 如果属性为单一类型,则映射为@Basic
  2. 如果属性对应的类型实现了Serializable, 则属性被映射为@Basic并在一个列中保存该对象的serialized版本
  3. 如果该属性的类型为Java.sql.Clob 或 java.sql.Blob,则作为@Lob并映射到适当的LobType。

2. @Lob注解属性

对于一些容量大的属性如文章、图片的数据,如果我们要保存到数据库,可以使用@Lob注解,先在User类中添加下面一个属性实例:

@Lob
private String text;
@Lob
private Byte[] image;

这时候,我们运行测试方法,hibernate会自动帮我们在数据库中生成相应的”大容量类型“属性:

FieldTypeNullDefaul
pro1blobYESNULL
pro2tinytextYESNULL
pro3mediumtextYESNULL
pro4textYESNULL

数据类型对应关系

java、MySQL、hibernate数据类型对应关系如下表所示:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅胖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值