hibernate5(4)实体映射注解配置[1]注解全面解析

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

配置实例

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

package com.zeng.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;

@Entity//声明当前类为hibernate映射到数据库中的实体类
@Table(name = "t_article2",catalog = "catolog",schema = "schema",uniqueConstraints = {@UniqueConstraint(columnNames = {"title","content"})})
//通过 @Table 为实体Bean指定对应数据库表,目录和schema的名字
//@UniqueConstraints 可以定义表的唯一约束。在title,和content加上唯一约束
public class User {
    @Id//声明此列为主键,作为映射对象的标识符
    /**
     *  @GeneratedValue注解来定义生成策略
     *  GenerationType.TABLES 当前主键的值单独保存到一个数据库的表中
     *  GenerationType.SEQUENCE  利用底层数据库提供的序列生成标识符
     *  GenerationType.IDENTITY 采取数据库的自增策略
     *  GenerationType.AUTO 根据不同数据库自动选择合适的id生成方案,这里使用mysql,为递增型
     */
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    @Column(insertable = true,length = 20,nullable = false,name = "user_name",unique = true,updatable = true)
    @Version //注解用于支持乐观锁版本控制。
    private String name;
    @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)
    private Integer age;
    @Transient//被标注此注解的属性不会被持久化到数据库
    private String temp;
    /**
     * @Lob 注解表示属性将被持久化为Blob或者Clob类型,
     * 具体取决于属性的类型, java.sql.Clob, Character[], char[] 和 java.lang.String这些类型的属性都被持久化为Clob类型,
     * 而java.sql.Blob, Byte[], byte[] 和 serializable类型则被持久化为Blob类型.
     */
    @Lob
    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会自动帮我们在数据库中生成相应的”大容量类型“属性:

Field Type Null Default
image longblob YES NULL
text longtext YES NULL

如果我们想自定制数据库中生成的属性类型,可以使用下面示例配置:

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

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

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

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

此时对应数据库中生成数据类型:

Field Type Null Default
pro1 blob YES NULL
pro2 tinytext YES NULL
pro3 mediumtext YES NULL
pro4 text YES NULL

数据类型对应关系

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

源码下载

本实例源码可到https://github.com/jeanhao/hibernate的下载。

时间: 2024-08-03 13:51:36

hibernate5(4)实体映射注解配置[1]注解全面解析的相关文章

hibernate5(5)实体映射注解配置[2]主键生成策略

@GeneratedValue基本注解类型 在上一篇文章中,我们讲到了JPA使用@GeneratedValue注解来定义生成策略,而关于注解生成策略有4种基本支持类型: 1. GenerationType.TABLES 当前主键的值单独保存到一个数据库的表中 2. GenerationType.SEQUENCE 利用底层数据库提供的序列生成标识符 3. GenerationType.IDENTITY 采取数据库的自增策略 4. GenerationType.AUTO 根据不同数据库自动选择合适的

ssh-SSH整合,hibernate注解配置,无hbm.xml,映射出现问题

问题描述 SSH整合,hibernate注解配置,无hbm.xml,映射出现问题 java实体类代码: package cn.com.car.base.entity; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; i

Hibernate(6)—— 一对多 和 多对多关联关系映射(xml和注解)总结

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotation) Many to Many 映射关系 多对多单向外键关联(XML/Annotation) 多对多双向外键关联(XML/Annotation) set的inverse元素详解 问题小结 关联关系的优缺点 多

Hibernate(5)—— 联合主键 、一对一关联关系映射(xml和注解) 和 领域驱动设计

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及的知识点总结如下: One to One 映射关系 一对一单向外键(XML/Annotation) 一对一双向外键关联(XML/Annotation) 联合主键 一对一单向外键联合主键(Xml/Annotation) 一对一组件关联(XML/Annotation) 理解组件 领域驱动设计--自动生成数据库脚本 一对一关系的小结 一些出错问题的总结   自动生成数据库脚本 一般在项目开发过程中,我们的习惯是先建好数据库和表,然后

【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】

官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociweb.com/jnb/jnbJan2010.html =============================================================================================================== 本来来说,lombok

javaweb-关于Struts2注解配置json问题。

问题描述 关于Struts2注解配置json问题. struts2的配置文件: <action name="subjectAction" class="com.H1.action.SubjectAction" method="doSubject"> <result type="json" > <param name="root">resultObj</param&g

在使用spring的过程中,service层写在配置文件中好呢还是注解配置好呢?

问题描述 在使用spring的过程中,service层写在配置文件中好呢还是注解配置好呢? 在使用spring的过程中,service层写在配置文件中好呢还是注解配置好呢?在配置文件中是这样的注解配置时这样的@Service(""userService"")说说理由哦. 解决方案 一般应用性开发使用注解就可以.它较xml配置方式的优势在于省去了xml复杂的配置,而且不需要维护两套内容(xml配置方式需要维护service类和xml文件).但是如果需要修改相关内容,注

spring学习笔记(24)基于注解配置事务

使用注解的方式配置事务极为便利,在xml文件上只需声明我们的注解,然后即可直接在相应service类通过标注注解来完成事务配置.相对于配置在xml文件,简洁了需要,但配置信息分散,会导致易读性大大减弱. 使用步骤: 1. 在spring容器中注册注解搜索器 目的是使分散在各业务类中的注解得以生效 <!-- 使用annotation定义事务 --> <tx:annotation-driven transaction-manager="transactionManager"

struts注解配置@namespace

问题描述 struts注解配置@namespace struts注解配置@namespace,每次在项目后加上namespace空间名找不到路径报404