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



我有以下模型:

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

在类似的情况下使用.NET中的Entity Framework,我可以急切地将Bar属性与以下内容结合起来:

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

有什么与Hibernate等效的东西吗?

我的情况是,我正在将一个具有惰性属性的对象保存到服务器中的会话中。然后,当我检索会话属性时,我无法访问惰性属性,因为Hibernate会话已经消失。我不能将此属性设置为EAGER,因为它是从许多其他类使用的@MappedSuperclass继承而来的。

谢谢你的帮助。

  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")
    )
    );
    

    你可以在那里看到另一个例子和更详细的解释。

  2. 休眠配置文件:

    @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);
    

您可以使用带有FETCH JOIN:的JPQL查询

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

通过这种方式,所有Foo类实例都将被加载,而所有Bar实例都已被提取。您可以根据需要定制查询。

最新更新