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

原创
2012/11/25 23:00
阅读数 2K
前面没有过多的描述@Id标注,现在拿出来单独谈谈!

1、主键标识(@Id)属性定义如下:
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Id {}

2、标注@Id后,还要涉及@GeneratedValue的使用
@GeneratedValue用于主键的生成策略,属性定义如下:
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface GeneratedVaule {
  GenerationType strategy() default AUTO;
  String generator() default "";
}
strategy属性表示生成主键的策略,定义在枚举类型GenerationType中:
public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO }

注:double和float浮点类型和它们对应的封装类不能作为主键,因为判断是否唯一是通过equals方法判断的,浮点型的精度太大,不能准确地匹配

3、自增主键
MySQL实现:

create table customer (
  id int(20) not null auto_increment,
)
而oracle可能需要创建Sequence来实现自增。
实体类的配置如下:
@Entity
@Table(name="customer")
public class CustomerEO implements java.io.Serializable {
  
  @Id
  @GeneratedVaule(strategy = GenerationType.AUTO)
  private Integer id;
  
  ...
}

4、表生成器(@TableGenerator)
使用sql创建一个表"tb_generator",如下:
create table tb_generator (
  id int(20) unsigned not null auto_increment,
  gen_name varchar(255) not null,
  gen_vaule int(20) not null,
  primary key (id)
)
insert into tb_generator (gen_name, gen_value) values ('CUSTOMER_PK','1');
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标记生成策略的具体设置:
@Id
GeneratedValue(strategy = GenerationType.TABLE, generator="customer_gen")
@TableGenerator(name = "customer_gen", table="tb_generator",
                pkColumnName="gen_name",
                vauleColumnName="gen_value",
                pkColumnValue="CUSTOMER_PK",
                allocatonSize=1
)
private Integer id;
@TableGenerator标记属性定义如下:
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface TableGenerator {
  String name();
  String table() default "";
  String catalog() default "";
  String schema() default "";
  String pkColumnName() default "";
  String valueColumnName() default "";
  int initiaValue() default 0;
  int allocationSize() default 50;
  UniqueConstraint[] uniqueConstraints() default();
}


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

create sequence customer_sequence start with 1 increment by 10


这个sequence从1开始,每次增长10(采用MySQL数据库中不支持Squence)
具体设置:

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="customer_seq")
@SequenceGenerator(name="customer_seq", sequenceName="customer_sequence")
private Integer id;


@SequenceGenerator属性定义如下:

@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
public @interface SequenceGenerator {
  String name();
  String sequenceName() default "";
  int inittialVaule() default 0;
  int allocationSize() default 50;
}


6、Identity生成器

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

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

8、映射Blob和Clob(@Lob)
加载图片或长文本时,使用@Lob标记:

@Lob
@Basic(fetch=FetchType.LAZY)
private byte[] image;

9、映射时间(Temporal)类型(@Temporal)
@Temporal(TemporalType.TIME) 
private java.util.Date createTime;

@Temporal(TemporalType.DATE)
private java.util.Date birthday;

@Temporal的定义如下:
public @interface Temporal {
  TemporalType value() default TIMESTAMP;
}

TemporalType枚举类型如下:
public enum TemporalType {
  DATE, // java.sql.Date
  TIME, // java.sql.Time
  TIMESTAMP  // java.sql.TimeStamp
}

10、映射非持久化类型(@Transient)
@Transient
private String property;
表示该实体内的"property"属性设置成非持久化的
展开阅读全文
JPa
打赏
1
6 收藏
分享
加载中
更多评论
打赏
0 评论
6 收藏
1
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部