天天看点

JPA Column注解

知识点:

@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表示小数点所占的位数。

precision和scale疑点:

@Table(name = "CUSTOMERS")
@Entity
public class Customer {
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Integer id;

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

    @Column(name = "Email", nullable = true, length = 128)
    private String email;

    @Column(name = "Age")
    private int age;

    @Column(name = "Remark", columnDefinition = "text")
    private String remark;

    @Column(name = "Salary1", columnDefinition = "decimal(5,2)")
    private double salary1;

    @Column(name = "Salary2", precision = 5, scale = 2)
    private double salary2;

    @Column(name = "Salary3", columnDefinition = "decimal(5,2)")
    private BigDecimal salary3;

    @Column(name = "Salary4", precision = 5, scale = 2)
    private BigDecimal salary4;
    ......
}
           

数据库DDL:

CREATE TABLE `customers` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Age` int(11) DEFAULT NULL,
  `Email` varchar(128) DEFAULT NULL,
  `Name` varchar(255) DEFAULT NULL,
  `Remark` text,
  `Salary1` decimal(5,2) DEFAULT NULL,
  `Salary2` double DEFAULT NULL,
  `Salary3` decimal(5,2) DEFAULT NULL,
  `Salary4` decimal(5,2) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
           

总结: 

1.double类型若在columnDefinition属性中指定数字类型为decimal并指定精度,则最终以columnDefinition为准 (oracle数据库中除外,其指定为float类型,因为oracle数据库没有double类型,若针对oracle数据库进行精确,则改为

@Column(name = "Salary1", columnDefinition = "decimal(5,2)")  //或columnDefinition = "number(5,2)"
    private Float salary1;
           

2.double类型将在数据库中映射为double类型,precision和scale属性无效 

3.BigDecimal类型在数据库中映射为decimal类型,precision和scale属性有效 

4.precision和scale属性只在BigDecimal类型中有效

继续阅读