欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

@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为急加载。