栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Hibernate延迟加载以实现一对一的反向解决方法-这项工作如何进行?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Hibernate延迟加载以实现一对一的反向解决方法-这项工作如何进行?

下面的代码告诉Hibernate使用拦截处理程序代替代理。

@LazyToOne(LazyToOneOption.NO_PROXY)

从javadoc:

返回请求引用时加载的真实对象(此选项必须增强字节码,如果未增强该类,则退回到PROXY)

可以看出,在使用字节码之前需要对其进行检测。检测“字节码”后,“持久类得到增强”。

这个想法是要愚弄Hibernate,我们要使用的实体类已经被检测了

编译代码后将调用检测任务。工具实体扩展

FieldHandled
FieldHandled
是“引入增强类的接口”

Hibernate在运行时验证实体,并得出结论,类得到了增强,这就是为什么它使用真实对象而不是代理并且不像往常那样加载相关实体对象的原因。

编辑:

让我们来看看幕后花絮:

  1. AnnotationBinder句柄

    NO_PROXY
    选项

    if ( lazy != null ) {toOne.setLazy( !( lazy.value() == LazyToOneOption.FALSE ) );toOne.setUnwrapProxy( ( lazy.value() == LazyToOneOption.NO_PROXY ) );

    }

  2. 这两个

    org.hibernate.mapping.ManyToOne
    org.hibernate.mapping.OneToOne
    是的子类
    org.hibernate.mapping.ToOne
    ToOne#isUnwrapProxy()
    唯一的用途是
    #getType

getMappings()。getTypeResolver()。getTypeFactory()。oneToOne(

  1. 这两个

    ManyToOneType
    OneToOneType
    是的子类
    EntityType
    ,只有“的EntityType#unwrapProxy”的用法是在
    EntityType#resolveIdentifier(Serializable, SessionImplementor)

    boolean isProxyUnwrapEnabled = unwrapProxy &&    session.getFactory() .getEntityPersister( getAssociatedEntityName() ) .isInstrumented();
  2. 这是暂定的呼叫层次结构:

    AbstractEntityPersister#isInstrumented()
    ->
    Entitymetamodel#isInstrumented()
    ->
    EntityInstrumentationmetadata#isInstrumented()
    ->等,最后
    BytepreProviderImpl.EntityInstrumentationmetadataImpl.EntityInstrumentationmetadataImpl()

     this.isInstrumented = FieldHandled.class.isAssignableFrom( entityClass );

这就是为什么需要检测代码(例如使用

InstrumentTask
)或实现的原因
FieldHandled


为了使长话短说你可以看一看

EntityType#resolveIdentifier(Serializable,SessionImplementor)
。这就是为什么即使第二个对象为空也不会加载的原因。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447670.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号