我有以下模型:
@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
继承的。
感谢您的帮助。
答案 0 :(得分:3)
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。
@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
类实例均已被获取。您可以定制查询以满足您的需求。