JPA常用注解
在JPA中主要使用如下5种注解:
- @Entity注解
标注一个实体类,如果没有进行任何其他配置,则表名称与类名称一致。 - @Table注解
如果现在表名称与持久化类名称不同,则利用此注解进行表名称定义。 - @Column注解
明确表示每一个列,定义实体类时即便不使用此注解,也可以实现列的映射定义。当用户执行DDL自动更新处理时,没有加入@Column注解的列将会自动按照该类型的最大长度进行创建。 - @Temporal注解
java.util.Date类中包含日期与时间,所以对于数据表字段上需要一个描述日期与日期时间类型的定义,这样就可以通过@Temporal注解中的TemporalType枚举来定义列类型保存结构,如DATE、TIME、TIMESTAMP。 - @Transient注解
默认情况下,只要是实体Bean中编写的属性,都会成为SQL生成后的字段描述。有时类里需要写一些临时变量,并不需要进行持久化处理,这时可以使用@Transient注解标注。
JPA主键生成策略
在实体类中进行主键列属性定义时,可以使用@Id注解完成。如果该属性上未添加任何注解,则表示此主键由开发者自行控制。如,用户表中用户名作为主键,则用户名要通过用户定义。如果要采用自动方式实现主键定义,则必须使用@GeneratedValue注解进行配置。
在@GeneratedValue注解中,提供了strategy属性,该属性用于配置主键的生成策略。JPA支持的主键生成策略由javax.persistence.GenerationType枚举类定义,有如下4种类:
- IDENTITY:采用数据库ID自增长的方式来自增主键字段,Oracle不支持这种方式。
- AUTO:JPA自动选择合适的策略,是默认选项。
- SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySQL不支持这种方式。
- TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植。
使用GenerationType.IDENTITY),利用MySQL提供的AUTO_INCREMENT字段来生成主键
除了使用传统数据库支持的方式外,也可以利用一张数据表来统一保存所有数据表的主键生成数据,此时,可以利用@TableGenerator与@GeneratedValue两个注解来实现。
此时dept表中的主键字段(deptno)内容会根据table_id_generate表与步长进行控制,全部处理操作都会由JPA负责实现。
提示:不建议采用数据表控制主键列数据。
虽然JPA提供了数据表主键控制处理,但从性能角度来讲,不建议如此操作。因为增加数据的同时涉及table_id_generate表的两次SQL操作,这样的做法将严重影响数据库的操作性能,在高并发访问下不可能采用。 最好的做法是基于Redis数据库创建一个主键生成程序,每次进行数据增加时通过此程序获取要操作的主键信息。这样的管理既高效又适合分布式开发。