当前位置: 首页 > 知识库问答 >
问题:

Hibernate代理对象包含什么?

百里光熙
2023-03-14

我能从谷歌得到的信息是:

>

  • Hibernate使用代理对象实现延迟加载。当我们请求从数据库加载对象,并且获取的对象引用了另一个具体对象时,Hibernate会返回一个代理,而不是具体的关联对象。

    Hibernate使用字节码检测(由javhelp提供)创建代理对象。Hibernate在运行时使用代码生成库创建我们实体类的子类,并用新创建的代理替换实际对象。

    那么,代理对象到底包含什么?

    它是否包含仅设置了id字段的骨架对象引用对象?调用get方法时会设置其他字段吗?

    代理对象是否包含JDBC语句,以获取完全填充引用对象所需的所有数据

    还有什么我可能错过的吗?

    我不是要求勺子喂养,但如果你能提供任何信息链接,那就太好了。

    对上述描述的任何更正也将受到欢迎。

    示例。

    class Address {
       String city;
       String country;
    }
    
    class Person{
       int id;
       String name;
       Address address;
    }    
    

    当我们尝试加载Person对象时,Hibernate将为Person类创建子类,如:

    class ProxyPerson extends Person {
           int id;
           String name;
           Address proxyCGLIBObject;
    }
    

    并返回一个ProxyPerson对象。ProxyPerson的对象将有一个id和name的值,但代理地址。

    我说得对吗?

    在代理对象上添加toString()方法会带来什么?

  • 共有1个答案

    上官锦
    2023-03-14

    Hibernate代理用于替换实际实体POJO(普通旧Java对象)。

    代理类是在运行时生成的,它扩展了原始实体类。

    Hibernate对实体使用代理对象是为了允许[延迟加载][1]。

    当访问代理上的基本属性时,它只是将调用委托给原始实体。

    实体类中的每个列表集合映射类型都被持久列表持久集合持久映射替换。这些类负责拦截对未初始化集合的调用。

    代理不发出任何SQL语句。它只是触发一个初始化集合事件,该事件由关联的侦听器处理,该侦听器知道要发出哪个初始化查询(取决于配置的获取计划)。

     类似资料:
    • 问题内容: 我可以从Google那里收集到的是: Hibernate使用代理对象来实现延迟加载。当我们请求从数据库中加载对象,并且获取的对象具有对另一个具体对象的引用时,Hibernate返回一个代理而不是具体的关联对象。 Hibernate使用字节码检测(由Javassist提供)创建代理对象。Hibernate在运行时使用代码生成库创建我们的实体类的子类,并将实际对象替换为新创建的代理。 那么

    • 问题内容: 我有一个服务方法,该服务方法调用DAO,然后从数据库中返回一个对象。从系统的许多部分调用此方法。但是,一种特定的方法是将ObjectClass _ $$ _ javassist_somenumber的返回类型作为该类型。这是丢东西。我将service方法称为与其他任何地方完全相同的方法,那么为什么hibernate会返回代理而不是自然对象? 我知道有很多方法可以暴露“代理”对象,但是我

    • 我用的是Gson。toJSON方法。我的pojo包含一个属性作为URL字符串。奇怪的是Gson转换器改变了URL字符 输出为:/myApp/myAction。html?方法\U003Drooter\u0026cmd\u003d1 预期输出为:/myApp/myAction。html?方法=路由器

    • 问题内容: 我有两个Hibernate数据对象。第一个是用户(具有唯一的ID,用户名等),第二个是Collaborateable类。在这两者之间存在n对m的关系(带有Set的实现)。这意味着,一个用户使用许多可协作对象,而一个可协作对象具有许多用户。另外,一个可协作对象只有一个用户作为所有者。 我想实现一个Hibernate查询,该查询搜索具有特定用户作为所有者或在Collaborateable.

    • 我从accuweather获得了以下带有json的代码 我尝试通过Jackson将此对象解析为POJO 我有json中指定的所有模型,如、数组、,由组成(在json中命名为最小值和最大值)等,它们都有私有字段和公共构造函数、getter和setter。但是我没有一些字段,因为我想省略它们(Day、night、EpochDate、Source)。 当我运行程序时,我得到了错误 com.fasterx

    • 所以我的问题是,为什么交易未能将它从Hibernate代理转换为真正的对象?而且,如果我从上面的注释中删除(fetch=fetchtype.lazy)部分,这是一个变通方法吗?不过,我不愿意这样做,因为上面的代码实际上在Measure的父类中,它可能会对其他代码产生连锁反应。(为了更简单的说明,我移动了贸易属性来度量)。