没有关系的休眠惰性对象

Hibernate Lazy Object With No Relations

我有一个 Hibernate 对象如下:

@Entity
@Table(name="SOME_TABLE")
public class SomeEntity {

private Long id;
private String someInfo;

@Id
@Column(name = "ID")
public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

@Column(name = "SOME_INFO")
public String getSomeInfo() {
    return someInfo;
}

public void setSomeInfo(String someInfo) {
    this.someInfo = someInfo;
}
}

使用以下代码加载对象时:

sessionFactory.getCurrentSession().load(getEntityClass(), id);

未加载对象的字段,而是 returned 代理对象,只有当我通过它们的 getter 方法显式调用它们时才会加载实际字段。 据我所知,应该急切地加载普通字段(基元、字符串)。为什么不是关系或集合的字段被延迟加载?有没有办法让 Hibernate 急切地加载它们? 这对我来说是有问题的,因为我使用这个对象作为 Spring REST 应用程序的 return 值,然后我得到一个 could not initialize proxy - no Session 异常。

您获得代理的原因是因为 Session#load 合约允许 return 代理作为占位符,而无需为指定对象查询数据库。这也是为什么您希望为其加载的提供的标识符存在是至关重要的,因为如果存在,您稍后将 运行 陷入意外的 ObjectNotFoundException 错误。

您要使用的是 Session#get 保证查询数据库而不是 return 代理,因此您提到的那些基本属性将如您所愿地被急切加载。

例如:

final Comment comment = new Comment( "This is a comment" );
comment.setOwner( session.load( Product.class, productId ) );
session.save( comment );

这里的好处是 Product 没有完全初始化。我们创建一个具有指定 productId 值的持久代理,并将其关联为评论的所有者。当我们坚持新的 Comment 使 foreign-key 关系发生而不必实际加载 Product 的状态时,这就足够了,避免了不必要的开销。