[英]Hibernate LazyInitializationException if entity is fetched in JWTAuthorizationFilter
[英]LazyInitializationException in Hibernate Entity getter
当我对ItemVersionLanguage对象执行Hibernate merge()时,出现“错误[org.hibernate.LazyInitializationException](pool-9-thread-1)无法初始化代理-没有会话:org.hibernate.LazyInitializationException:无法初始化代理-没有会话”。
但是,当我从中获取数据时,可以从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;
}
}
我做错什么了吗?
延迟初始化使变量可以充当代理,可以根据需要获取其值。 当代码在关闭检索实体的会话之后尝试从变量中读取时,会发生此错误,这使代理无法延迟获取其值。
您可以使用Hibernate.initialize(itemVersionLanguage.getItemVersion())在关闭会话之前加载代理的值。
有关更多详细信息,请参见http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-fetching-initialization 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.