我有以下模型:
@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
继承而来的。
谢谢你的帮助。
-
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") ) );
你可以在那里看到另一个例子和更详细的解释。
-
休眠配置文件:
@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
实例都已被提取。您可以根据需要定制查询。