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

时间:2018-12-05 16:18:01

标签: java hibernate

我有以下模型:

@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继承的。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

  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 = Employee.class,
                association = "projects",
                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);
    

答案 1 :(得分:1)

您可以对FETCH JOIN使用JPQL查询:

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

通过这种方式,所有Foo类实例都将被加载,其中所有Bar类实例均已被获取。您可以定制查询以满足您的需求。