主键映射以及特殊类型映射(三)
前面没有过多的描述@Id标注,现在拿出来单独谈谈!
1、主键标识(@Id)属性定义如下:
1 |
@Target({METHOD, FIELD}) @Retention(RUNTIME) | |
2 |
public @interface Id {} |
2、标注@Id后,还要涉及@GeneratedValue的使用
@GeneratedValue用于主键的生成策略,属性定义如下:
1 |
@Target({METHOD, FIELD}) @Retention(RUNTIME) | |
2 |
public @interface GeneratedVaule { |
3 |
GenerationType strategy() default AUTO; | |
4 |
String generator() default ""; |
5 |
} |
strategy属性表示生成主键的策略,定义在枚举类型GenerationType中:
1 |
public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO } |
注:double和float浮点类型和它们对应的封装类不能作为主键,因为判断是否唯一是通过equals方法判断的,浮点型的精度太大,不能准确地匹配
3、自增主键
MySQL实现:
1 |
create table customer ( | |
2 |
id int(20) not null auto_increment, |
3 |
) |
而oracle可能需要创建Sequence来实现自增。
实体类的配置如下:
01 |
@Entity | |
02 |
@Table(name="customer") |
03 |
public class CustomerEO implements java.io.Serializable { | |
04 |
|
05 |
@Id | |
06 |
@GeneratedVaule(strategy = GenerationType.AUTO) |
07 |
private Integer id; | |
08 |
|
09 |
... | |
10 |
} |
4、表生成器(@TableGenerator)
使用sql创建一个表"tb_generator",如下:
1 |
create table tb_generator ( | |
2 |
id int(20) unsigned not null auto_increment, |
3 |
gen_name varchar(255) not null, | |
4 |
gen_vaule int(20) not null, |
5 |
primary key (id) | |
6 |
) |
7 |
insert into tb_generator (gen_name, gen_value) values ('CUSTOMER_PK','1'); |
8 |
insert into tb_generator (gen_name, gen_value) values ('CONTACT_PK','100') |
数据库如下:
id |
gen_name |
gen_value |
1 |
CUSTOMER_PK |
1 |
2 |
CONTACT_PK |
100 |
使用@TableGenerator标记生成策略的具体设置:
1 |
@Id | |
2 |
GeneratedValue(strategy = GenerationType.TABLE, generator="customer_gen") |
3 |
@TableGenerator(name = "customer_gen", table="tb_generator", | |
4 |
pkColumnName="gen_name", |
5 |
vauleColumnName="gen_value", |
6 |
pkColumnValue="CUSTOMER_PK", |
7 |
allocatonSize=1 | |
8 |
) |
9 |
private Integer id; |
@TableGenerator标记属性定义如下:
01 |
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) | |
02 |
public @interface TableGenerator { |
03 |
String name(); | |
04 |
String table() default ""; |
05 |
String catalog() default ""; | |
06 |
String schema() default ""; |
07 |
String pkColumnName() default ""; | |
08 |
String valueColumnName() default ""; |
09 |
int initiaValue() default 0; | |
10 |
int allocationSize() default 50; |
11 |
UniqueConstraint[] uniqueConstraints() default(); | |
12 |
} |
5、Sequence生成器(@Sequence)
SQL脚本:
1 |
create sequence customer_sequence start with 1 increment by 10 |
这个sequence从1开始,每次增长10(采用MySQL数据库中不支持Squence)
具体设置:
1 |
@Id | |
2 |
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="customer_seq") |
3 |
@SequenceGenerator(name="customer_seq", sequenceName="customer_sequence") | |
4 |
private Integer id; |
@SequenceGenerator属性定义如下:
1 |
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) | |
2 |
public @interface SequenceGenerator { |
3 |
String name(); | |
4 |
String sequenceName() default ""; |
5 |
int inittialVaule() default 0; | |
6 |
int allocationSize() default 50; |
7 |
} |
6、Identity生成器
1 |
@Id | |
2 |
@GeneratedValue(strategy = GenerationType.IDENTITY) |
3 |
private Integer id; |
7、几种主键生成策略的比较
(1)sequence,identity
两种策略针对的是一些特殊的数据库
(2)auto自动生成策略由JPA实现,对于比较简单的主键,对主键生成策略要求较少时,采用这种策略好
(3)table生成策略是将主键的持久化在数据库中,建议使用该策略
8、映射Blob和Clob(@Lob)
加载图片或长文本时,使用@Lob标记:
1 |
@Lob | |
2 |
@Basic(fetch=FetchType.LAZY) |
3 |
private byte[] image; |
9、映射时间(Temporal)类型(@Temporal)
1 |
@Temporal(TemporalType.TIME) | |
2 |
private java.util.Date createTime; |
3 |
| |
4 |
@Temporal(TemporalType.DATE) |
5 |
private java.util.Date birthday; |
@Temporal的定义如下:
1 |
public @interface Temporal { | |
2 |
TemporalType value() default TIMESTAMP; |
3 |
} |
TemporalType枚举类型如下:
1 |
public enum TemporalType { | |
2 |
DATE, // java.sql.Date |
3 |
TIME, // java.sql.Time | |
4 |
TIMESTAMP // java.sql.TimeStamp |
5 |
} |
10、映射非持久化类型(@Transient)
1 |
@Transient | |
2 |
private String property; |
表示该实体内的"property"属性设置成非持久化的