主要包括:
- @Id、@GeneratedValue
- @Column
- @Column之columnDefinition
- @Column控制浮点数精度
- @Temporal
- @Transient
@Id:
@Id 标注用于声明一个实体类的属性映射为数据库的主键列。该属性通常置于属性声明语句之前,可与声明语句同行,也可写在单独行上。
@Id标注也可置于属性的getter方法之前。
@GeneratedValue:
@GeneratedValue 用于标注主键的生成策略,通过strategy 属性指定。默认情况下,JPA 自动选择一个最适合底层数据库的主键生成策略:SqlServer对应identity,MySQL 对应 auto increment。
在javax.persistence.GenerationType中定义了以下几种可供选择的策略:
–IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle 不支持这种方式;
–AUTO: JPA自动选择合适的策略,是默认选项;
–SEQUENCE:通过序列产生主键,通过@SequenceGenerator 注解指定序列名,MySql不支持这种方式
–TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
推荐的两种写法:
属性之上:
@Table(name="CUSTOMERS") @Entity public class Customer { @GeneratedValue(strategy=GenerationType.AUTO) @Id private Integer id; private String name; private String email; private int age; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; }
getter方法之上
@Table(name="CUSTOMERS") @Entity public class Customer { private Integer id; private String name; private String email; private int age; @GeneratedValue(strategy=GenerationType.AUTO) @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; }
但是不能某个注解在属性之上,某个注解在getter之上,将抛出异常,对其他注解也相同
@Table(name="CUSTOMERS") @Entity public class Customer { @Id private Integer id; private String name; private String email; private int age; @GeneratedValue(strategy=GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; }
上面的写法是错误的
@Column:
当实体的属性与其映射的数据库表的列不同名时需要使用@Column 标注说明,该属性通常置于实体的属性声明语句之前,还可与 @Id 标注一起使用。
@Column 标注的常用属性是name,用于设置映射数据库表的列名。此外,该标注还包含其它多个属性,如:unique、nullable、length 等。
@Column 标注的columnDefinition属性: 表示该字段在数据库中的实际类型.通常 ORM 框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP.此外,String的默认映射类型为VARCHAR,如果要将 String 类型映射到特定数据库的 BLOB 或TEXT字段类型.
@Column标注也可置于属性的getter方法之前
name属性:
name属性定义了被标注字段在数据库表中所对应字段的名称
unique属性:
unique属性表示该字段是否为唯一标识,默认为false。
如果表中有一个字段需要唯一标识,则既可以使用该标记,也可以使用@Table注解中的@UniqueConstraint,详情可参考@Table注解 详解
nullable属性:
nullable属性表示该字段是否可以为null值,默认为true
insertable属性:
insertable属性表示在使用”INSERT”语句插入数据时,是否需要插入该字段的值
updateable属性:
updateable属性表示在使用”UPDATE”语句插入数据时,是否需要更新该字段的值
insertable和updateable属性一般多用于只读的属性,例如主键和外键等,这些字段通常是自动生成的
columnDefinition属性:
columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用
如果数据库中表已经建好,该属性没有必要使用
table属性:
table属性定义了包含当前字段的表名
length属性:
length属性表示字段的长度,当字段的类型为varchar时,该属性才有效,默认为255个字符
precision属性和scale属性:
precision属性和scale属性一起表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数
columnDefinition属性的使用:
@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",columnDefinition="varchar(128) not null") private String email; @Column(name = "Age") private int age; ...... }数据库DDL:
CREATE TABLE `customers` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Age` int(11) DEFAULT NULL, `Email` varchar(128) NOT NULL, `Name` varchar(255) DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;columnDefinition可以指定创建表时一些SQL语句,比如这里可以一次性指定,varchar长度128,且不能为空
当然,相同的结果可以通过nullable和length属性结合实现
@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; ...... }
数据库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, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
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;
columnDefinition属性的特殊使用:
编程语言中字符串一般都用String表示,但是数据库中varcahr数值类型有长度限制,一旦需要大文本,则需要text数值类型
但是String类型默认映射的数值类型是varchar,columnDefinition可以进行额外指定
@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; }
数据库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, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
remark列数值类型是text,而Name和Email默认是varcahr
控制浮点精度:
@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类型将在数据库中映射为double类型,precision和scale属性无效
2.double类型若在columnDefinition属性中指定数字类型为decimal并指定精度,则最终以columnDefinition为准
3.BigDecimal类型在数据库中映射为decimal类型,precision和scale属性有效
4.precision和scale属性只在BigDecimal类型中有效
在核心的JPA API中没有定义Date类型的精度,数据库中表示Date类型的数据有DATE,TIME,TIMESTAMP三种精度,可通过@Temporal注解进行调整
@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") private String email; @Column(name = "Age") private int age; @Temporal(TemporalType.DATE) @Column(name="Birthday") private Date birthday; @Temporal(TemporalType.TIMESTAMP) @Column(name="CreateTime") private Date createTime; }
数据库DDL:
CREATE TABLE `customers` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Age` int(11) DEFAULT NULL, `Birthday` date DEFAULT NULL, `CreateTime` datetime DEFAULT NULL, `Email` varchar(255) DEFAULT NULL, `Name` varchar(255) DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
当然@Column的columnDefinition属性也可以实现相同的效果
@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") private String email; @Column(name = "Age") private int age; @Column(name="Birthday",columnDefinition="date") private Date birthday; @Column(name="CreateTime",columnDefinition="datetime") private Date createTime; }
@Transient:
表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.
如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic
当实体对象中有一些独有属性时,可以使用该注解,进行忽略
@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") private String email; @Column(name = "Age") private int age; @Transient private String address; }
数据库DDL:
CREATE TABLE `customers` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Age` int(11) DEFAULT NULL, `Email` varchar(255) DEFAULT NULL, `Name` varchar(255) DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
数据库表中不会创建address列
相关推荐
@Column(updatable = false, name = "flight_name", nullable = false, length=50) public String getName() { ... } 定义 name 属性映射到 flight_name column, not null, can't update, length equal 50 @...
JPA 批注参考-精心整理版1 不下你会后悔的,代码、表格、注视全部精心整理
* @Column —— 注解声明了属性到列的映射。该注解有如下的属性 * name 可选,列名(默认值是属性名) * unique 可选,是否在该列上设置唯一约束(默认值false) * nullable 可选,是否设置该列的值可以为空(默认值...
@Column(name = "ID", nullable = false, length = 32) {{?}} @Column(name = "{{=field.name}}", nullable = true) private {{=field.type}} {{=it.func.camel(field.name,false)}}; {{~}} } $blankline $...
<ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="*" /> ...
边缘 创建UI(WPF)的新语法。 样本: using SomeNamespace; Window { Title: "kjgkhj", Icon: BitmapImage("Icon.ico"), ... ColumnDefinitions: [ ColumnDefinition { Width: 100 }, ... Grid.Column: 1,
功能:通过响应UI Textbox 的值向ListView 绑定新添加的纪录。 UI XAML 代码 代码如下:”5″> <ColumnDefinition Width=”Auto”/> <ColumnDefinition> <RowDefinition Heigh
<Border x:Name="ContentPanel" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="1" Keyboard...
XAML: 代码如下: <ColumnDefinition Width=”2*”/> <ColumnDefinition Width=”8*”/> <Ro