没有关系的休眠惰性对象
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
的状态时,这就足够了,避免了不必要的开销。
我有一个 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
的状态时,这就足够了,避免了不必要的开销。