Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库。
这些普通Java对象被称作Entity Bean。
除了是用Java Persistence元数据将其映射到数据库外,Entity Bean与其他Java类没有任何区别。
事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。
Java Persistence API还定义了一种查询语言(JPQL),具有与SQL相类似的特征,只不过做了裁减,以便处理Java对象而非原始的关系表。
注意:在Hibernate中也有@Entity和Table这两个注解,但是其中@Entity注解已经废弃,所以本文只分析JPA下的注解
首先看看个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package com.xwj.entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; @Entity @Table (name = "xwj_user" , schema = "test" ) public class UserEntity { @Id @GeneratedValue (generator = "system-uuid" ) @GenericGenerator (name = "system-uuid" , strategy = "uuid" ) @Column (name = "ID" , unique = true , nullable = false , length = 32 ) private Integer id; @Column (name = "last_name" ) private String lastName; @Column (name = "email" , length = 32 ) private String email; //TODO get和set方法略... } |
解释:
@Entity 表明该类 (UserEntity) 为一个实体类,它默认对应数据库中的表名是user_entity。这里也可以写成
@Entity(name = "xwj_user")
或者
@Entity
@Table(name = "xwj_user", schema = "test")
查看@Entity注解,发现其只有一个属性name,表示其所对应的数据库中的表名
@Table 当实体类与其映射的数据库表名不同名时需要使用 @Table注解说明,该标注与 @Entity 注解并列使用,置于实体类声明语句之前,可写于单独语
句行,也可与声明语句同行。
@Table注解的常用选项是 name,用于指明数据库的表名
@Table注解还有两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名
如果缺省@Table注解,则class字段名即表中的字段名,所以需要@Column注解来改变class中字段名与db中表的字段名的映射规则
1 2 3 4 5 6 7 8 9 | @Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息,属性如下: 1)name:映射的列名。如:映射tbl_user表的name列,可以在name属性的上面或getName方法上面加入; 2)unique:是否唯一; 3)nullable:是否允许为空; 4)length:对于字符型列,length属性指定列的最大字符长度; 5)insertable:是否允许插入; 6)updatetable:是否允许更新; 7)columnDefinition:定义建表时创建此列的DDL; 8)secondaryTable:从表名。如果此列不建在主表上(默认是主表),该属性定义该列所在从表的名字 |
如果是主键id,还会用到@Id注解
1 2 3 4 5 6 | @Id注释指定表的主键,它可以有多种生成方式: 1)TABLE:容器指定用底层的数据表确保唯一; 2)SEQUENCE:使用数据库德SEQUENCE列莱保证唯一(Oracle数据库通过序列来生成唯一ID); 3)IDENTITY:使用数据库的IDENTITY列莱保证唯一; 4)AUTO:由容器挑选一个合适的方式来保证唯一; 5)NONE:容器不负责主键的生成,由程序来完成。 |
其中与@Id一起使用的还有另外两个注解:@GeneratedValue、@GenericGenerator
springboot中@GeneratedValue作用:
(1)、@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键、@GeneratedValue提供了主键的生成策略。
(2)、@GeneratedValue注解有两个属性,分别是strategy和generator,
generator属性:
generator属性的值是一个字符串,默认为"",其声明了主键生成器的名称
(对应于同名的主键生成器@SequenceGenerator和@TableGenerator)。
strategy属性:提供四种值:
-AUTO主键由程序控制, 是默认选项 ,不设置就是这个
-IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式
-SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持
-Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植
注意:默认SpringBoot的@GeneratedValue 是不需要加参数的,但是如果数据库控制主键自增(auto_increment)没有设置, 参数就会报错