主键映射以及特殊类型映射(三)

主键映射以及特殊类型映射(三)

前面没有过多的描述@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 }

注:doublefloat浮点类型和它们对应的封装类不能作为主键,因为判断是否唯一是通过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

}


5Sequence生成器(@Sequence
SQL脚本:

1

create sequence customer_sequence start with 1 increment by 10


这个sequence1开始,每次增长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

}


6Identity生成器

1

@Id

2

@GeneratedValue(strategy = GenerationType.IDENTITY)

 

3

private Integer id;


7、几种主键生成策略的比较 
1sequence,identity 两种策略针对的是一些特殊的数据库 
2auto自动生成策略由JPA实现,对于比较简单的主键,对主键生成策略要求较少时,采用这种策略好 
3table生成策略是将主键的持久化在数据库中,建议使用该策略 

8、映射BlobClob(@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"属性设置成非持久化的 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值