在 Hibernate 中使用惰性属性

2024-01-11

hibernate 中属性标签的惰性属性允许按照链接延迟加载属性:http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping-declaration-property http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping-declaration-property

惰性(可选 - 默认为 false):指定此属性 首次访问实例变量时应延迟获取。 它需要构建时字节码检测。

但是,当我尝试为我的一个属性设置lazy=true时,在本例中它并没有延迟加载:

休眠映射文件:

<hibernate-mapping package="org.hibernate.tutorial.domain">

    <class name="Event" table="EVENTS" select-before-update="true">
        <id name="id" column="EVENT_ID">
            <generator class="native" />
        </id>
        <property name="date" type="timestamp" column="EVENT_DATE" />
        <property name="title" lazy="true"/>

        <set name="participants" table="PERSON_EVENT" inverse="true">
            <key column="EVENT_ID" />
            <many-to-many column="PERSON_ID" class="Person" />
        </set>
    </class>

</hibernate-mapping>

Program:

public static void main(String[] args) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Event event = (Event) session.get(Event.class, 135L);
        session.getTransaction().commit();
        System.out.println(event);
        HibernateUtil.getSessionFactory().close();
    }

hibernate生成的查询:

Hibernate: select event0_.EVENT_ID as EVENT1_0_0_, event0_.EVENT_DATE as EVENT2_0_0_, event0_.title as title0_0_ from EVENTS event0_ where event0_.EVENT_ID=?

请帮助我理解为什么懒惰者在这种情况下不起作用?


使用 Hibernate 5,这可以使用字节码增强轻松完成 https://vladmihalcea.com/how-to-lazy-load-entity-properties-with-hibernate/.

首先,您需要添加以下 Maven 插件:

<plugin>
    <groupId>org.hibernate.orm.tooling</groupId>
    <artifactId>hibernate-enhance-maven-plugin</artifactId>
    <version>${hibernate.version}</version>
    <executions>
        <execution>
            <configuration>
                <enableLazyInitialization>true</enableLazyInitialization>
            </configuration>
            <goals>
                <goal>enhance</goal>
            </goals>
        </execution>
    </executions>
</plugin>

然后,您可以简单地注释您的实体属性@Basic(fetch = FetchType.LAZY):

@Entity(name = "Event")
@Table(name = "event")
public class Event extends BaseEntity {

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    @Basic(fetch = FetchType.LAZY)
    private Location location;

    public Location getLocation() {
        return location;
    }

    public void setLocation(Location location) {
        this.location = location;
    }
}

当您获取实体时:

Event event = entityManager.find(Event.class, 
    eventHolder.get().getId());

LOGGER.debug("Fetched event");
assertEquals("Cluj-Napoca", event.getLocation().getCity());

Hibernate 将使用辅助选择来加载惰性属性:

SELECT e.id AS id1_0_0_
FROM   event e
WHERE  e.id = 1

-- Fetched event

SELECT e.location AS location2_0_
FROM   event e
WHERE  e.id = 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Hibernate 中使用惰性属性 的相关文章

随机推荐

  • 在 Rcpp(Eigen) 中在 NumericVector/Matrix 和 VectorXd/MatrixXd 之间进行转换以执行 Cholesky 求解

    Edit 根据下面德克的回答的一些线索 我解决了这个问题 现在解决了问题的正文 我确信这必须记录在某处 但我的谷歌技能让我失望 我正在开发一个 Rcpp 包 我认为我不需要 依赖于特征 所以我使用NumericVector Matrix相当
  • Windsor可以与其他IoC容器合作吗?

    在我们应用程序的核心中 我们使用 Castle Windsor 来管理我们的依赖项 我们将从第三方加载插件 这些插件可能使用他们自己的 IoC 容器 我们希望它们能够从核心接收依赖项 例如通过构造函数注入核心的服务 还可以从自己的 IoC
  • Jenkins CORS Filter 插件未添加 Access-Control-Allow-Origins 标头

    我正在尝试向我的 Jenkins 服务器添加 CORS 支持 以便我可以从浏览器访问 REST API 环顾四周 推荐的方法是使用CORS 过滤器插件 https github com jenkinsci cors filter plugi
  • 如何在 XAML ListBox 中使用多重绑定?

    下面显示了列表框中的 3x MultiTest Model Customers 它应显示的每条记录一个 我需要改变什么才能让它输出contents代替字段
  • underlineColorAndroid 无法在 android 中工作

    react native cli 2 0 1 react native 0 52 2 在我的 ios 设备中 表单看起来不错 但在 Android 设备中 它在 TextInput 上显示底部边框 class Input extends C
  • 如果要调用多个成员函数,对象编辑器是一个好方法吗?

    我经常对这样的类成员函数的顺序调用感到恼火 忽略新用法 它是针对 Qt 的 但它与 Qt 并不严格相关 A a new A a gt fun1 one a gt fun2 1 2 a gt fun10 end 我总觉得这样的代码应该写成简单
  • 对不确定数量的 Pandas 系列进行逐元素逻辑与

    假设我有一个 n 的列表 可迭代 其中 n 对于函数来说是未知的 Pandas Series 表示逻辑布尔索引 我想对所有这些元素进行 AND 并使用生成的 Series 来索引 DataFrame 目前我正在使用np logical an
  • 如何在Android Studio/IntelliJ中导入Maven依赖?

    我使用 Android Studio 中的默认向导创建了一个新的 Android 项目 编译并将应用程序部署到我的设备上 一切都很好 现在我想导入 Maven 上可用的外部库 http square github io picasso ht
  • 无法连接到 Windows Azure VM (Server 2012 R2) Web 部署服务

    我似乎无法将站点部署到在 Azure VM 中运行 IIS 和 Web 部署的 Windows Server 2012 r2 我已验证端口是否打开 凭据是否正确以及站点名称是否正确 我尝试使用 http 和 https 也尝试 使用 msd
  • 386+ 处理器中的复位向量

    维基百科页面为重置向量 http en wikipedia org wiki Reset vector说 对于 386 处理器 复位时 CS 寄存器选择器部分的值为 F000h CS 寄存器基址部分的值为 FFFF0000h 复位时 IP
  • Django 和 SaaS。如何为每个 Django 站点使用单独的数据库?

    我正在使用 Django 创建一个 SaaS 项目 我决定使用django saas kit https github com zhaque django saas kit对于用户订阅和多帐户部分 理想情况下 我希望能够为每个用户创建一个新
  • C++ 和完全动态函数

    我有走弯路的问题 众所周知 Detours 只能在 5 个字节的空间之间移动 即 jmp 调用和 4 个字节的地址 因此 类 方法 中不可能有 hook 函数 您无法提供 this 指针 因为根本没有足够的空间 here s https s
  • Flask 应用程序无法在 heroku 服务器上启动

    我正在尝试使用 Heroku 部署 Flask 应用程序 这是简单的 API 与 foreman 一起在本地工作得很好 但在 heroku 上启动时出现错误 日志如下 这是我的应用程序代码 我知道它只是在一个块中查找 但我在将其拆分为文件时
  • VB.Net 损坏的字符串 - IDE 错误地将字符串解释为代码

    今天我打开了一个 Visual Basic 项目 其中有几行声明了一些字符串 其中包含逗号分隔的数据 我修改了其中一根字符串 重建并关闭了该项目 当我来测试时 出现了错误 当我查看代码时 我发现我修改的那一行之后的字符串也发生了变化 它们在
  • 使用 URLClassLoader 动态加载 JAR?

    我有一个程序需要能够在运行时动态加载 JAR 环顾四周后我相信它使用了 URLClassLoader 但我不确定如何让它工作 JAR openup jar 与程序位于同一目录中 Ideally我希望能够加载这个 JAR 而不必指定其中的每个
  • 在 Linux 上将 MSword 转换为 XML/HTML

    我需要将 MSWord 文件转换为 XML 或 HTML 同时保留文件的结构 主要是表格 我偶然发现了tika 它在从MSword文件 和任何文件 中提取文本方面非常强大 如下 curl www vit org downloads doc
  • TFS 2017 不构建 Fakes 目标

    我有一个安装了 VS 2017 Enterprise 的 TFS 2017 Update 2 本地服务器 我们的构建包含一个单元测试项目 其中包含一个 Fakes 程序集并在开发计算机上本地工作 在 TFS 上构建时 构建失败并显示 命名空
  • 动态插入 iframe 中的 jQuery .ready

    我们正在使用 jQuerythickbox http jquery com demo thickbox 当有人点击图片时动态显示 iframe 在此 iframe 中 我们使用galleria http devkick com lab ga
  • 更改总计和tax_total Woocommerce

    我使用自定义计算创建自定义结帐页面 我如何无法通过 Ajax 更改总计和tax total 或根据需要刷新页面 我为 ajax 请求创建自定义页面并设置此代码 ss new WC Session Handler ss gt set tax
  • 在 Hibernate 中使用惰性属性

    hibernate 中属性标签的惰性属性允许按照链接延迟加载属性 http docs jboss org hibernate orm 3 3 reference en US html mapping html mapping declara