gpt4 book ai didi

java - 没有关系的 Hibernate 惰性对象

转载 作者:行者123 更新时间:2023-12-02 03:04:19 24 4
gpt4 key购买 nike

我有一个 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);

对象的字段未加载,而是返回代理对象,并且仅当我通过其 getter 方法显式调用它们时才加载实际字段。据我所知,应该立即加载普通字段(基元、字符串)。为什么非关系或集合的字段会被延迟加载?有没有办法让 Hibernate 急切地加载它们?这对我来说是有问题的,因为我使用这个对象作为 Spring REST 应用程序的返回值,然后我得到一个 无法初始化代理 - 无 session 异常。

最佳答案

您获取代理的原因是因为 Session#load 合约允许返回代理作为占位符,而无需在数据库中查询指定对象。这也是为什么您希望加载的所提供的标识符是否存在至关重要,因为如果存在的话,您稍后会遇到意外的 ObjectNotFoundException 错误。

您想要使用的是Session#get,它保证查询数据库并且不会返回代理,因此您提到的那些基本属性将如您所期望的那样被急切加载。

例如:

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

这样做的好处是 Product 没有完全初始化。我们使用指定的 productId 值创建一个持久代理,并将其关联为评论的所有者。当我们持久化新的 Comment 以使外键关系发生时,这已经足够了,而无需实际加载 Product 的状态,从而避免了不必要的开销。

关于java - 没有关系的 Hibernate 惰性对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41964199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com