映射优化一:基本数据类型与封装类
JPA对于可以持久化的java类型,可以映射基本的数据类型,如byte,int,short,long,Boolean,char,float.double等。另外,也可以映射成Byte,Integer,Short,Long,Boolean,Character,Float,Double类型。但是,究竟选择哪种类型比较合适呢?
举例说明下.
在一张表person的定义中,如下:
> ``` CREATE TABLE person{ id int(20) NOT NULL, name varchar(50)
> NOT NULL, age int(11) default NULL } ```
- 对于字段id,它的值不能为null,所以可以映射为int型或Integer型
- 但是,对于age而言,它的值可能为null.若此时Entity的对应属性的类型为int,则将一个null的值转化为int型必定会产生转换异常。但是Entity对应的属性为Integer时,它是一个对象,其值可以转为null,不会产生问题。
所以,建议标注实体的属性使用Java基本类型的包装类。
当然这样可能会牺牲一些转化效率,但是很好的避免了持久化数据时产生的一些异常问题。
映射优化二:@Basic设置加载方式
在默认的情况下,实体的属性均为即时加载(EAGER),即当实体对象实例化时,就加载了实体中相应的属性。
但是,对于一些特殊的属性,如长文本类型、字节流类型,在加载实体时,这些属性对应的数据较大,在创建实体时就加载,可能会造成资源的严重占用,这是就需要设置属性的加载方式为惰性加载(LAZY)。
@Basic标记可以指定实体属性的加载方式,定义方式如下:
@Target({METHOD, FIELD}) @Retention(RUNTIME)
public @interface Basic {
FetchType fetch() default EAGER;
boolean optional() default true;
}
Fetch属性表示获取值的方式,它的值是定义的枚举类型,枚举类型的定义如下。
public enum FetchType { LAZY, EAGER };
加载方式,LAZY和EAGER。LAZY 表示即时加载、EAGER表示惰性加载。默认为即时加载
如果属性不使用@Basic标记,属性的加载方式为默认的加载方式,例如不标注@Basic标记的属性设置。
private String name;
@Column(name="CONTACT_EMAIL")
public String getName() {
return name;
}
等价于:
private String name;
@Basic(fetch=FetchType.EAGER)
@Column(name="CONTACT_EMAIL")
public String getName() {
return name;
}
属性optional表示属性是否可为null,不能用于Java基本数据类型byte,int,short,long,boolean,char,float,double的使用。