@Lazy和@Proxy,关联关系@OneToOne,@OneToMany,@ManyToOne,@ManyToMany
程序员文章站
2022-04-22 16:10:21
...
1、@Lazy和@Proxy
@Lazy:一般定在在类头上。
添加之后默认表示实现懒加载。
懒加载是一种代理加载模式,可以理解为创建对象的时候,先创建对象的代理,代理中申明对象,但是不将对象实体化,当使用实体属性或者方法的时候,才加载创建实体并执行实例方法。
@Lazy(value=false)
即不实现懒加载,为急加载。
@Proxy:可以和@Lazy等同。
他有两个属性
// 默认懒加载,false为急加载
boolean lazy() default true;
// 默认设置为自己的类名。如果有代理类或者被继承,使用他们的类名。
Class proxyClass() default void.class;
在有关联的entity实体类中,不建议在类头上添加@Proxy和@Lazy,这样做对于不理解懒加载底层原理的开发者会造成迷惑,同时也会导致实现关联属性业务不好细分。
建议在关联中通过fetch参数设置。可细分一个实体中存在多属性关联的加载关系。
有人说采用懒加载可以节省性能,优化系统使用资源,在大数据量,数据长期持久不变化的情况下,的确可以减少系统开销。但是在数据快速变化,并且写操作较多的场景下,频繁的创建和释放实体和代理,有导致vm内存碎片的风险;同时也会导致获取数据一致性变差,出现异常的可能性。
2、关联关系@OneToOne,@OneToMany,@ManyToOne,@ManyToMany
关联关系有:
@OneToOne:一对一,
// 默认指定标记下的声明对象的类型
Class targetEntity() default void.class;
// 默认无级联关系操作,可以为多个操作集合
CascadeType[] cascade() default {};
// 默认采用急加载,获取这个实体操作的时候,会从同时从数据库找查询最新的关联实体
FetchType fetch() default EAGER;
// 是否允许级联对象为null,默认允许。optional=false,级联对象必须存在。
boolean optional() default true;
// 默认空字符串表示对关系的维护,建议由一方维护,另一方不进行维护。在不维护方类中“维护方属性变量”上设置,设置值为“被维护方在维护方中的属性或者集合”的变量名。
String mappedBy() default "";
// 是否级联删除,和CascadeType.REMOVE的效果一样,只要配置了两种的一种就会自动级联删除
boolean orphanRemoval() default false;
@OneToMany:一对多,
// 默认指定标记下的声明对象的类型
Class targetEntity() default void.class;
// 默认无级联关系操作,可以为多个操作集合
CascadeType[] cascade() default {};
// 默认采用懒加载
FetchType fetch() default LAZY;
// 默认空字符串表示对关系的维护,建议由一方维护,另一方不进行维护。在不维护方类中“维护方属性变量”上设置,设置值为“被维护方在维护方中的属性或者集合”的变量名。
String mappedBy() default "";
// 是否级联删除,和CascadeType.REMOVE的效果一样,只要配置了两种的一种就会自动级联删除
boolean orphanRemoval() default false;
@ManyToOne:多对一,
// 默认指定标记下的声明对象的类型
Class targetEntity() default void.class;
// 默认无级联关系操作,可以为多个操作集合
CascadeType[] cascade() default {};
// 默认采用急加载
FetchType fetch() default EAGER;
// 是否允许级联对象为null,默认允许。optional=false,级联对象必须存在。
boolean optional() default true;
@ManyToMany:多对多。
// 默认指定标记下的声明对象的类型
Class targetEntity() default void.class;
// 默认无级联关系操作,可以为多个操作集合
CascadeType[] cascade() default {};
// 默认采用懒加载
FetchType fetch() default LAZY;
// 默认空字符串表示对关系的维护,建议由一方维护,另一方不进行维护。在不维护方类中“维护方属性变量”上设置,设置值为“被维护方在维护方中的属性或者集合”的变量名。
String mappedBy() default "";
fetch=FetchType.EAGER
为急加载。