@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 属性定义了被标注字段在数据库表中所对应字段的名称。例如:
@Column(name = "name") private String username;
上面指定实体类的 username 属性对于数据表的 name 列。
unique 属性表示该字段是否为唯一标识,默认为 false。如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用 @Table 注解中的 uniqueConstraints 属性。例如:
@Column(name = "name", unique = true) private String name;
上面指定实体类的 name 属性为唯一标识,即不允许该值重复。
nullable 属性表示该字段是否可以为 null 值,默认为 true。例如:
@Column(name = "name", unique = true, nullable = false) private String name;
上面指定实体类的 name 属性值唯一,且不能为空。
insertable 属性表示在使用“INSERT”脚本插入数据时,是否需要插入该字段的值。
updatable 属性表示在使用“UPDATE”脚本插入数据时,是否需要更新该字段的值。insertable 和 updatable 属性一般多用于只读的属性,例如主键和外键等。这些字段的值通常是自动生成的。
columnDefinition 属性表示创建表时,该字段创建的SQL语句,一般用于通过 Entity 生成表定义时使用(也就是说,如果DB中表已经建好,该属性没有必要使用)。例如:
// 使用 columnDefinition 指定的 SQL 语句去创建 email 字段 // 注意:SQL语句中不要指定列名称,列名称由JPA自动指定 @Column(columnDefinition = "varchar(128) DEFAULT 'default@gmail.com'") private String email;
table 属性定义了包含当前字段的表名。例如:
// 指定 name 字段来自 usercolumn 数据表 @Column(name = "name", table = "usercolumn") private String name;
length 属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符。例如:
// 指定 name 字段字符串最大长度为125字符 @Column(name = "name", length = 125) private String name;
precision 属性和 scale 属性表示精度,当字段类型为 double 时,precision 表示数值的总长度,scale 表示小数点所占的位数。例如:
// salary 字段最大8位数字,其中3位为小数点 @Column(scale = 3, precision = 8) private Float salary;