JPA——映射优化

本文探讨了在使用Java持久化API (JPA) 进行数据库操作时,如何合理选择基本数据类型及其封装类来避免空指针异常,并介绍了如何通过@Basic注解设置属性的加载方式来优化资源占用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

映射优化一:基本数据类型与封装类

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的使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值