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

惰性= false的Hibernate 2级缓存对象会导致默认的fetch = join,它在任何地方都有记录吗?

孟开宇
2023-03-14
问题内容

我遇到以下明显未记录的问题,我想了解是否

  1. 我做错事情了
  2. 有人遇到过同样的问题吗?
  3. 真的没有任何地方记录吗?还是我错过了什么?

行为是这样假定以下映射

<class name="org.sample.Foo" table="foo">
    ...
   <many-to-one name="bar" class="org.sample.Bar"/>
</class>


<class name="org.sample.Bar" table="bar" lazy="false">
    ...
</class>

首先,作为背景,多对一关系中 fetch 属性的Hibernate默认值应为“ select
”,至少这是已记录的内容(找到链接后,将在此处添加链接)

但是,这显然仅在所引用的类为lazy =“ true”时才为真!

因此,显然上述映射已转换为此映射(因为Bar为lazy =“ false”):

<class name="org.sample.Foo" table="foo">
    ...
   <many-to-one name="bar" class="org.sample.Bar" *fetch="join" />
</class>


<class name="org.sample.Bar" table="bar" lazy="false">
    ...
</class>

现在为什么会是一个问题?而不是2个选择,Hibernate将通过其“父代”在单个选择中加载非延迟引用(在单个选择中使用Bar加载Foo)

这实际上是有道理的,因为对象不是惰性的,为什么不加载它呢?

答案是这样的:如果Bar位于第二级缓存中,会发生什么?

<class name="org.sample.Foo" table="foo">
    ...
   <many-to-one name="bar" class="org.sample.Bar" *fetch="join" />
</class>


<class name="org.sample.Bar" table="bar" lazy="false">
    <cache usage="transactional" />
    ...
</class>

答案是-没有改变!

显然,人们会假设Hibernate足够聪明,可以理解不应加载这种类型的对象,但是由于默认的获取方式已从select更改为join,因此Hibernate没有选择的余地(您无法使用2级缓存,但)

因此,Hibernate会按照所告知的方式进行操作,并使用联接从已经在第二级缓存中的数据库中获取对象

我发现的解决方案是从字面上将映射更改为fetch =“ select”

现在,当Bar的第二个选择即将执行时,Hibernate知道它不应该进入数据库,并从缓存中获取它。并且仅执行1个查询(预热后)


问题答案:

我遇到了同样的问题,发现自己将所有多对一关系标记为,并将其缓存为fetch="select"。在建立查询时,Hibernate无法知道所请求的Bar实例是否在二级缓存中(假定Foo不在缓存中)。



 类似资料:
  • 这里我有一个条件,假设一个用户通过调用API登录。并且响应包含用户的详细信息。我们是否可以将用户的详细信息保存为一个对象,并且可以全局访问?下面是我如何使用ObjectMapper调用模型类的api: } 从我的社交档案来看, 有些解决方案可能使用UserDefaults,但是使用9个UserDefaults来保存我们从这个响应中得到的9个键是不实际的。有什么建议的方法,我们可以这样做,当用户登录

  • 问题内容: 我正在尝试将Infinispan配置为休眠二级缓存。一切都很好,但是我想调整默认配置,即所有缓存共享的值。 缓存是用于注明实体自动创建的,我可以通过一个在对其进行自定义一个通过。但是,我希望所有这些缓存都具有默认值(例如,逐出策略)。 另一件事是,我想将所有这些生成的缓存标记为“分布式”(默认情况下它们是“本地的”)。 这是我的摘录: 我该怎么做? 问题答案: 实体的默认缓存配置名为:

  • 我在中获取lazy关联时遇到问题。我有一个电影列表,它与使这部电影最受欢迎的用户和类型列表有关联: 体裁还与将该体裁标记为喜爱的用户有关联: 我有一个存储库,具有以下方法/查询,必须按最喜欢的流派返回所有电影,并加载电影的用户,以便我可以显示用户是否将电影标记为最喜欢的电影: 但是这里我有一个问题,在执行此查询后是空的。 我发现使用可能会有所帮助,但它没有movie.get用户()关联仍然是空的。

  • 问题内容: 我正在使用HttpURLConnection连接到SSL网站。有时这些会使用自签名证书/否则会表现不佳的SSL,因此我有一种可以访问这些证书的方式。我在网上许多地方都使用推荐的典型代码: 问题是,这会导致许多站点出现SSL错误,例如: https://cong-shalom.org/ 原因: 启用javax.net.debug = all时的输出: https://www.territ

  • 问题内容: 每个Java 都有方法和(以及其他变体)。我从来没有使用过这些,我怀疑很多其他人没有使用过。为什么这些是如此基本,以至于每个对象都必须拥有它们,并且拥有它们会对性能产生影响(大概在其中存储了某种状态)? 编辑 以强调该问题。如果我有一个具有100,000个元素的元素,那么每个元素都具有从扩展的这些方法。但是似乎所有这些都不大可能必须了解管理的线程。 编辑 出色而有用的答案。@Jon有一

  • 问题内容: Hibernate使用的默认缓存的名称是什么?甚至有默认的缓存,还是必须添加缓存提供程序才能利用缓存? 我以为是EHCache,但我认为必须对其进行配置…默认情况下它不是“那里” … 问题答案: Hibernate已经通过持久上下文提供了一种称为 一级缓存 的缓存机制。它在 Session作用域内,默认情况下处于启用状态,无法关闭。 诸如EHCache之类的缓存提供程序提供了另一种称为