gpt4 book ai didi

java - Hibernate Entity getter 中的 LazyInitializationException

转载 作者:太空宇宙 更新时间:2023-11-04 08:18:59 24 4
gpt4 key购买 nike

当我对 ItemVersionLanguage 对象执行 Hibernate merge() 时,我从下面的代码中收到“错误 [org.hibernate.LazyInitializationException] (pool-9-thread-1) 无法初始化代理 - 无 session :org.hibernate.LazyInitializationException:无法初始化代理 - 无 session ”。

但是当我从中获取数据时,它可以从 ItemVersion 或 ItemVersionLanguage 的 url 正常工作。

我没有 @Transactional 来包装 merge() 所在的代码。

ItemVersionLanguage.java

@Entity
@Table(name = "item_version_language")
public class ItemVersionLanguage implements java.io.Serializable {
private String url;
private ItemVersion itemVersion;

public void setUrl(String url)
{
this.url = url;
}
@Column(name = "url")
public String getUrl()
{
if(this.url == null)
{
return this.itemVersion.url; //this results in the problem!
}
else
{
return this.url;
}
}
public void setItemVersion(ItemVersion itemVersion)
{
this.itemVersion = itemVersion;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_version_obj_id", nullable = false)
public ItemVersion getItemVersion()
{
return this.itemVersion;
}
}

ItemVersion.java

@Entity
@Table(name = "item_version")
public class ItemVersion implements java.io.Serializable {
private String url;

public void setUrl(String url)
{
this.url = url;
}
@Column(name = "url")
public String getUrl()
{
return this.url;
}
}

我做错了什么吗?

最佳答案

延迟初始化使变量能够充当代理,可以根据需要获取其值。当代码在检索实体的 session 关闭后尝试读取变量时,会发生此错误,这使得代理无法延迟获取其值。

您可以使用 Hibernate.initialize(itemVersionLanguage.getItemVersion()) 在 session 关闭之前加载代理的值。

参见http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching-initialization了解更多详情。

关于java - Hibernate Entity getter 中的 LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9931700/

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