代码之家  ›  专栏  ›  技术社区  ›  João Menighin

获取特定对象的特定惰性属性

  •  0
  • João Menighin  · 技术社区  · 7 年前

    我有以下型号:

    @Table(name = "foo")
    public class Foo {
    
        @ManyToOne(fetch = FetchType.LAZY)
        private Bar bar;
    
    }
    

    Entity Framework Bar 具有以下内容的属性:

    context.Foo.Include(f => f.bar).First()
    

    Hibernate有什么等价物吗?

    我的情况是,我正在将具有惰性属性的对象保存到服务器中的会话中。然后,当我检索会话属性时,我无法访问Hibernate会话的lazy属性,因为该会话已经消失。我不能把这个财产当作 EAGER 因为它是从一个 @MappedSuperclass 被很多其他类使用。

    谢谢你的帮助。

    2 回复  |  直到 7 年前
        1
  •  3
  •   Aleksandr Semyannikov    5 年前
    1. JPA EntityGraph

      @Entity
      @Table(name = "foo")
      @NamedEntityGraph(name = "foo.bar",
              attributeNodes = @NamedAttributeNode("bar")
      )
      public class Foo {
      
          @ManyToOne(fetch = FetchType.LAZY)
          private Bar bar;
      
      }
      
      Foo foo = entityManager.find(
          Foo.class,
          id,
          Collections.singletonMap(
              "javax.persistence.fetchgraph",
              entityManager.getEntityGraph("foo.bar")
          )
      );
      

      您可以看到另一个示例和更详细的解释 there .

    2. Hibernate profiles

      @Entity
      @Table(name = "foo")
      @FetchProfile(
          name = "foo.bar",
          fetchOverrides = {
              @FetchProfile.FetchOverride(
                  entity = Foo.class,
                  association = "bar",
                  mode = FetchMode.JOIN
              )
          }
      )
      public class Foo {
          @ManyToOne(fetch = FetchType.LAZY)
          private Bar bar;
      }
      
      
      session.enableFetchProfile("foo.bar");
      Foo foo = session.byId(Foo.class).load(id);
      
        2
  •  1
  •   Lorelorelore R. Foxwood    7 年前

    您可以将JPQL查询用于 FETCH JOIN :

    List<Foo> l = em.createQuery(
        "SELECT f FROM Foo f JOIN FETCH f.bar", Foo.class)
        .getResultList();
    

    就这样 Foo Bar 已获取实例。您可以根据需要定制查询。