@Entity
该注解用于实体类声明语句之前,说明该JAVA类为实体类,将要映射到指定的数据库表;默认实体类的类名就是数据库的表名;
@Table
当实体类与其映射的数据库表名不一致时,需要使用该注解来标注说明;
该注解与@Entity注解并列使用,放在实体类声明语句之前,也可以写于单独语句行,也可与声明语句在同一行;
@Table注解常用的是name属性,该属性指明数据库的表名;另外该注解还有ccatalog和schema用于设置表所属的数据目录、模式,通常为数据库名;而uniqueConstraints用于设置约束条件,一般不必设置;
@Id
用于声明一个实体类的属性映射为数据库的主键列,该属性通常放在属性声明语句之前,可以与声明语句同一行,也可以单独在一行;
该注解放在属性的getter方法之前;
@GeneratedValue
用于标注主键的生成策略,通过strategy属性来指定生成策略,默认情况下,JPA自动选择一个最适合底层数据库的主键生成策略,例如:sqlserver对应identity,mysql对应autoincrement;
在javax.persistence.GenerationType中预定义了几种可供选择的策略:
①IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle暂不支持该方式;
②AUTO:JPA自己选择合适的策略,是默认选项;
③SEQUENCE:通过sequence序列来产生序列,通过@SequenceGenerator注解来指定序列名称,mysql暂不支持该方式;
④TABLE:通过表来产生主键,框架借由表模拟序列来产生主键,使用该策略可以使得应用更方便数据库迁移;
@TableGenerator
@TableGenerator注解的作用,就是前提提到主键生成策略的时候(strategy=GenerationType.TABLE),为了方便在不同数据库之间进行迁移,把主键放到单独的表中,然后每次从表中读取、递增、更新;(我上一个公司就是这么做的)
该注解配合@GeneratedValue(strategy=GenerationType.TABLE)注解一起使用;
该注解属性有:
①name:表示该主键生成策略的名称,它被引用在@GeneratedValue注解的generator属性中;
②table:表示生成策略所持久化的表名;
③pkColumnName:在持久化表中,表示该主键生成策略所对应的键值的名称;
④pkColumnValue:在持久化表中,表示该主键生成策略所对应的键值的名称;
⑤valueColumnName:表示持久化表中,该生成策略所对应的主键;
举个例子:
|
GeneratedKey |
GeneratedValue |
Info |
|
news_id |
100 |
新闻表news的主键 |
|
comment_id |
50 |
评论表news_comment的主键 |
这里的GeneratedKey就是pkColumnName属性对应的名称;
这里的news_id就是pkColumnValue属性对应的名称;
这里的news_id对应的100的列名GeneratedValue就是valueColumnName属性对应的名称;
⑥allocationSize:每次主键值增加的大小,默认为50;
@Basic
该注解表示一个简单的属性到数据库表的字段映射,对于没有任何标注的getXXXX方法,其默认的就是@Basic注解;
该注解的fetch属性表示实体类的属性的读取策略,分为EAGER、LAZY这两种,分别表示主支抓取、延迟加载,默认值是EAGER;
该注解的optional属性表示该实体类的属性是否允许为null,默认为true;
@Column
当实体的属性与其映射的数据库表的列不同名的时候,需要使用该注解来进行标注说明;该属性通常放在实体的属性声明语句之前,可以与@Id注解一起使用;
@Column注解常用属性是name,用于设置映射数据库表的列名,同时,该注解还有unique、nullable、length、columnDefinition等属性;
其中columnDefinition属性表示该字段在数据库中的实际类型,通常ORM框架可以根据属性类型去自动判断数据库中字段的类型,但是对于Date类型让无法确定数据库中column到底是DATE、TIME、TIMESTAMP,还有就是String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或者TEXT类型;
@Column注解也可以置于属性的getter方法之前;
@Transient
表示该属性并非是一个到数据库表的字段的映射,ORM框架将忽略该属性;如果一个属性并非数据库表的字段映射,就务必将其表示为@Transient,否则OMR框架默认为其添加@Basic注解;
@Temporal
数据库中表示时间的类型,大致有3种:DATE/TIME/TIMESTAMP,而JAVA中的Date类型没有定义具体精度,这里使用@Temporal注解来说明java中的Date映射到数据库表时对应的时间精度;
3843

被折叠的 条评论
为什么被折叠?



