@Column 注解

@Column 注解用来标识实体类中属性与数据表中字段的对应关系。例如我们拥有如下数据表:

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `age` int(10) unsigned DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

我们可以使用 @Column 注解将上面的 id、name 和 age 数据表列和实体类中的属性进行映射,如下:

@Entity
@Table(name = "users")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column
    private String name;
    @Column
    private Integer age;
    // ...
}

上面使用 UserEntity.id 属性映射 users.id 数据表字段,UserEntity.name 属性映射 users.name 数据表字段,UserEntity.age 属性映射 users.age 数据表字段。

要详细了解 @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 属性定义了被标注字段在数据库表中所对应字段的名称。例如:

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

上面指定实体类的 username 属性对于数据表的 name 列。

unique

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

@Column(name = "name", unique = true)
private String name;

上面指定实体类的 name 属性为唯一标识,即不允许该值重复。

nullable

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

@Column(name = "name", unique = true, nullable = false)
private String name;

上面指定实体类的 name 属性值唯一,且不能为空。

insertable

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

updatable

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

columnDefinition

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

// 使用 columnDefinition 指定的 SQL 语句去创建 email 字段
// 注意:SQL语句中不要指定列名称,列名称由JPA自动指定
@Column(columnDefinition = "varchar(128) DEFAULT 'default@gmail.com'")
private String email;

table

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

// 指定 name 字段来自 usercolumn 数据表
@Column(name = "name",  table = "usercolumn")
private String name;

length

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

// 指定 name 字段字符串最大长度为125字符
@Column(name = "name", length = 125)
private String name;

precision 和 scale

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

// salary 字段最大8位数字,其中3位为小数点
@Column(scale = 3, precision = 8)
private Float salary;
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号