主鍵映射以及特殊類型映射(三)

前面沒有過多的描述@Id標註,如今拿出來單獨談談!

一、主鍵標識(@Id)屬性定義以下:
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Id {}

二、標註@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方法判斷的,浮點型的精度太大,不能準確地匹配 java

三、自增主鍵
MySQL實現: sql

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;
  
  ...
}

四、表生成器(@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();
}


五、Sequence生成器(@Sequence)
SQL腳本: 數據庫

create sequence customer_sequence start with 1 increment by 10


這個sequence從1開始,每次增加10(採用MySQL數據庫中不支持Squence)
具體設置: oracle

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


@SequenceGenerator屬性定義以下: ide

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


六、Identity生成器 fetch

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

七、幾種主鍵生成策略的比較
(1)sequence,identity 兩種策略針對的是一些特殊的數據庫
(2)auto自動生成策略由JPA實現,對於比較簡單的主鍵,對主鍵生成策略要求較少時,採用這種策略好
(3)table生成策略是將主鍵的持久化在數據庫中,建議使用該策略

八、映射Blob和Clob(@Lob)
加載圖片或長文本時,使用@Lob標記: spa

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

九、映射時間(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
}

十、映射非持久化類型(@Transient)
@Transient
private String property;
表示該實體內的"property"屬性設置成非持久化的
相關文章
相關標籤/搜索