就像@Table注解用来标识实体类与数据表的对应关系类似,@Column注解来标识实体类中属性与数据表中字段的对应关系。

该注解的定义如下:

@Target({METHOD, FIELD}) @Retention(RUNTIME) 
public @interface Column { 
String name() default ""; 
boolean unique() default false; 
boolean nullable() default true; 
boolean insertable() default true; 
boolean updatable() default true; 
String columnDefinition() default ""; 
String table() default ""; 
int length() default 255; 
int precision() default 0; 
int scale() default 0; 
}

从定义可以看出,@Column注解一共有10个属性,这10个属性均为可选属性,各属性含义分别如下:

name
name属性定义了被标注字段在数据库表中所对应字段的名称;

unique
unique属性表示该字段是否为唯一标识,默认为false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table标记中的@UniqueConstraint。

nullable
nullable属性表示该字段是否可以为null值,默认为true。

insertable
insertable属性表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。

updatable
updatable属性表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable和updatable属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。

columnDefinition
columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。(也就是说,如果DB中表已经建好,该属性没有必要使用。)

table
table属性定义了包含当前字段的表名。

length
length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。

precision和scale
precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。

API文档地址: http://docs.oracle.com/javaee/5/api/javax/persistence/Column.html

在使用此@Column标记时,需要注意以下几个问题:

此标记可以标注在getter方法或属性前,例如以下的两种标注方法都是正确的:

标注在属性前:

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Table;

@Entity 
@Table(name = "contact") 
public class ContactEO {

@Column(name = " contact_name ") 
private String name;

public String getName() { 
return name; 
}

public void setName(String name) { 
this.name = name; 
} 
}

标注在getter方法前:

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.Table;

@Entity 
@Table(name = "contact") 
public class ContactEO { 
private String name;

@Column(name = " contact_name ") 
public String getName() { 
return name; 
}

public void setName(String name) { 
this.name = name; 
} 
}

提示:JPA规范中并没有明确指定那种标注方法,只要两种标注方式任选其一都可以。这根据个人的喜好来选择,笔者习惯使用第二种方法。

下面举几个小例子:

示例一:指定字段“contact_name”的长度是“512”,并且值不能为null。

private String name; 
@Column(name="contact_name",nullable=false,length=512)

public String getName() { 
return name; 
}

创建的SQL语句如下所示。

CREATE TABLE contact ( 
id integer not null, 
contact_name varchar (512) not null, 
primary key (id) 
)

示例二:指定字段“monthly_income”月收入的类型为double型,精度为12位,小数点位数为2位。

private BigDecimal monthlyIncome; 
@Column(name="monthly_income",precision=12, scale=2) 
public BigDecimal getMonthlyIncome() { 
return monthlyIncome; 
}

创建的SQL语句如下所示。

CREATE TABLE contact ( 
id integer not null, 
monthly_income double(12,2), 
primary key (id) 
)

示例三:自定义生成CLOB类型字段的SQL语句。

private String name; 
@Column(name=" contact_name ",columnDefinition="clob not null") 
public String getName() { 
return name; 
}

生成表的定义SQL语句如下所示。

CREATE TABLE contact ( 
id integer not null, 
contact_name clob (200) not null, 
primary key (id) 
)

其中,加粗的部分为columnDefinition属性设置的值。若不指定该属性,通常使用默认的类型建表,若此时需要自定义建表的类型时,可在该属性中设置。

提示:通过Entity定义生成表,还是通过表配置Entity,这是两种不同的ORM策略。

示例四:字段值为只读的,不允许插入和修改。通常用于主键和外键。

private Integer id;

@Column(name="id",insertable=false,updatable=false) 
public Integer getId() { 
return id; 
}

Spring @Column的注解详解的更多相关文章

  1. Spring IoC 公共注解详解

    前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 什么是公共注解?公共注解就是常见的Java ...

  2. Spring IoC @Autowired 注解详解

    前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 我们平时使用 Spring 时,想要 依赖 ...

  3. Spring MVC @RequestMapping注解详解

    @RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) pa ...

  4. Spring MVC @RequestMapping注解详解(2)

    @RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) pa ...

  5. 27. Spring Boot 缓存注解详解: @Cacheable、@CachePut、 @CacheEvict、@Caching、@CacheConfig

     1.使用OGNL的命名规则来定义Key的值 @Cacheable(cacheNames = {"user"},key = "#root.methodName + '[' ...

  6. Spring Boot 最核心的 3 个注解详解

    最近面试一些 Java 开发者,他们其中有些在公司实际用过 Spring Boot, 有些是自己兴趣爱好在业余自己学习过.然而,当我问他们 Spring Boot 最核心的 3 个注解是什么,令我失望 ...

  7. Spring中的注入方式 和使用的注解 详解

    注解:http://www.cnblogs.com/liangxiaofeng/p/6390868.html 注入方式:http://www.cnblogs.com/java-class/p/4727 ...

  8. Spring Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  9. @RequestBody, @ResponseBody 注解详解(转)

    原文地址: https://www.cnblogs.com/qq78292959/p/3760651.html @RequestBody, @ResponseBody 注解详解(转) 引言: 接上一篇 ...

随机推荐

  1. python的debug神器PySnooper

    同事给我推荐了这个调试神器,一直没工夫看,今天看了下. 原文链接: 史上最方便的Python Debug工具|腾讯技术说 体验了下,感觉最好的用法:1.优先逐行调试:2.一些复杂状态处理或者偶现的bu ...

  2. java8中的map 和reduce

    map 1.使用map让集合里面的数字翻倍. List<Integer> numbers = Lists.newArrayList(1,2,3,4,5);List<Integer&g ...

  3. Java线程——线程之间的通信

    Java中多线程间的通信是怎么实现的? 线程通信的方式: (1)共享变量 线程之间的通信可以通过发送信号,发送信号的一个简单方法就是再共享的对象里面设置信号值.线程A在一个同步块中设置boolean型 ...

  4. Window Mysql5.7免安装版配置

    1.下载mysql 5.7 32位:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-win32.zip 5.7 64位:https ...

  5. 卡常的编译命令(含O2优化)

    不解释,直接来 //包括O2,O3之类的编译命令 //直接copy and paste #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma ...

  6. mysql增删查改

    <?php     $db_host   = 'localhost:3306';     $db_user   = 'root';     $db_passwd = '';     $db_na ...

  7. TiKV 在京东云对象存储元数据管理的实践

    京东云对象存储是在 2016 年作为公有云对外公开的,主要特点是可靠.安全.海量.低成本,应用于包括一些常用的业务场景,比如京东内部的京东商城视频/图片云存储,面向京东云公有云外部的开发者的服务,和面 ...

  8. 201512-1 数位之和 Java

    思路: mod 10获取最低位,除以10去掉最低位 import java.util.Scanner; public class Main { public static void main(Stri ...

  9. 2×c列联表|多组比例简式|卡方检验|χ2检验与连续型资料假设检验

    第四章 χ2检验 χ2检验与连续型资料假设检验的区别? 卡方检验的假设检验是什么? 理论值等于实际值 何条件下卡方检验的需要矫正?如何矫正? 卡方检验的自由度如何计算? Df=k-1而不是n-1 卡方 ...

  10. Halcon中将16位的图像转化为8位的图像

    Halcon中Image有多种像素表示方式,这方面网上找到的资料比较少,有一张大恒图像培训的文档中提到过,感觉描述比较准确: 里面有四种类型比较类似:uint2.int1.int2.int4. 区分起 ...