当前位置: 首页 > 面试题库 >

一对一hibernate:getId()无需获取整个对象

邓俊英
2023-03-14
问题内容

我想获取一对一关系的ID,而不加载整个对象。我以为可以使用如下所示的延迟加载来做到这一点:

class Foo { 
    @OneToOne(fetch = FetchType.LAZY, optional = false)
    private Bar bar; 
}


Foo f = session.get(Foo.class, fooId);  // Hibernate fetches Foo

f.getBar();  // Hibernate fetches full Bar object

f.getBar().getId();  // No further fetch, returns id

我希望f.getBar() 触发另一个提取。我希望hibernate给我一个代理对象,该代理对象使我可以调用.getId()而不实际获取Bar对象。

我究竟做错了什么?


问题答案:

使用 财产访问策略

代替

@OneToOne(fetch=FetchType.LAZY, optional=false)
private Bar bar;

采用

private Bar bar;

@OneToOne(fetch=FetchType.LAZY, optional=false)
public Bar getBar() {
    return this.bar;
}

现在工作正常!

如果调用 不是标识符getter方法的 任何方法 则会初始化代理。但是它仅在使用属性访问策略时有效。记在心上。

请参阅:Hibernate
5.2用户指南



 类似资料:
  • 我在spring boot API工作。这是我第一次遇到这个问题。 谢谢你的回答:)

  • 我有非常复杂的冬眠结构,有许多@manytomy、@ManyToOne、@OneToOne等关联。这些嵌套的集合/对象也有自己的嵌套对象/集合。整个对象被延迟加载。 我试图实现的是,对于一个特定的操作,能够急切地获取整个对象。 我做了一些研究,但我所能找到的只是需要指定每个对象/集合并手动获取的解决方案。 有没有一种方法可以获取整个对象结构,而无需指定需要获取的每个对象?

  • 问题内容: 考虑: 我该怎么做: 显然,这不起作用,因为第一个索引名为,而不是。 可以,但是我不知道它的名字叫foo。它可以命名为任何东西。我只想要第一个。 问题答案: 如果对象的顺序很重要,则应修改JSON模式以将对象存储在数组中: 或许: 正如Ben Alpert指出的那样,Javascript对象的属性是无序的,并且如果希望它们按与对象常量中指定的顺序相同的顺序枚举,则代码将被破坏-没有“f

  • 我有三个表/实体: > 游戏 网站游戏 地点 我必须在教义2中写查询,这将使所有游戏(作为对象)可用于特定的网站(得到这个特定的网站作为对象)。唯一的关系(多对一)在表/实体SiteGame中,它包含列/对象: 游戏/游戏id 站点/站点id 通常,原始SQL看起来像(并且可以工作): 这是我在教义中尝试过的,但失败了: 错误:路径表达式无效。必须是StateFieldPathExpression

  • 2021-03-10 20:24:23.268调试118757--[main]org.hibernate.sql:更新学生集name=?,team=?,year=?其中UNIQUE_NUMBER=? 我原以为只会发出一个“更新年份”声明,但令我惊讶的是,看起来所有的事情都像一对经典的findOne()/save()操作一样完成了。我错了吗?

  • 问题内容: hibernate映射中的默认访存类型是什么? 探索之后我知道的是: 渴望 一对一。 对于一对多来说,这是 懒惰的 。 但是在Eclipse中对其进行测试后,它对所有人都非常渴望。 是否取决于我使用的是JPA还是Hibernate? 问题答案: 这取决于您使用的是JPA还是Hibernate。 根据JPA 2.0规范,默认值为: hibernate的时候,一切都是懒惰的 更新: 最新版