开发者社区> 问答> 正文

org.hibernate.LazyInitializationException异常问题?报错

Hi,大家好!今天遇到org.hibernate.LazyInitializationException这个异常,百思不得解,所以来请教下。我的Hibernate是3.5.6-Final,Spring是3.1.2.RELEASE。

首先我有三个Entity:MailingWayEntity(简写为A)、MailingWayPriceEntity(B)、MailingWayLinkEntity(C)。其中AB是一对多的关系,前者是一方,B跟C 也是一对多的关系,前者是一方。

MailingWayEntity(A)中这么定义多方:

/**
* 报价单
*/
@OneToMany(mappedBy = "mailingWay")
@Cascade(value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
private Set<MailingWayPriceEntity> mailWayPrice = new HashSet<MailingWayPriceEntity>();



MailingWayPriceEntit(B)y中这么定义:
/**
* 邮寄方式
*/
@ManyToOne(fetch = FetchType.EAGER)
@Cascade(value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinColumn(name = "mailing_way_id", referencedColumnName="id")
MailingWayEntity mailingWay = new MailingWayEntity();

/**
* 报价单-报价单规则-区域的中间表
*/
@OneToMany(mappedBy = "mailingWayPrice", fetch = FetchType.LAZY)
@Cascade( value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
Set<MailingWayLinkEntity> mailingWayLink = new HashSet<MailingWayLinkEntity>();

MailingWayLinkEntity(C)中是这么定义的:

/**
* 报价单
*/
@ManyToOne(fetch = FetchType.EAGER)
@Cascade( value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinColumn(name = "mailing_way_price_id", referencedColumnName="id")
private MailingWayPriceEntity mailingWayPrice = new MailingWayPriceEntity();

然后我在一个Service上这么写就会报错:

Set<MailingWayPriceEntity> prices = entity.getMailWayPrice();//从entity(A方)得到Set<B>,没问题,
MailingWayPriceEntity price = null; 
Set<MailingWayLinkEntity> linkes; 
for(MailingWayPriceEntity pr:prices){
  if(pr.getDefaultUse() == 1){
    price = pr;
    linkes = price.getMailingWayLink();//从B方得到Set<C>,抛异常LazyInitializationException
    break;
  }
}

异常信息:

2015-02-03 15:55:00,427 
[org.hibernate.LazyInitializationException]-[ERROR] illegal access to loading collection
 org.hibernate.LazyInitializationException: illegal access to loading collection
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:366)
	at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:111)
	at org.hibernate.collection.PersistentSet.toString(PersistentSet.java:332)
<p>
	<br>
</p>
<p>
	<br>
</p>

自己搜索后大部分说是fetch的原因,因为是Lazy,延迟加载;可是延迟加载是先不初始化,但是我现在已经调用了,那Hibernate是需要帮我加载数据的,可是现在它还是抛异常了,肯定是哪里出问题,特来请教下大家。先谢了。







展开
收起
爱吃鱼的程序员 2020-06-14 18:01:15 665 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    抛什么异常要贴出来吧,不然怎么看啊。嗯贴出来了。似乎是和你使用hashset有关,看下你的entity是否有覆盖hashCode方法?两边的fetch都设置为lazy。就可以。不过还是对实现不清不楚。没事,我再看看!非常感谢你的帮忙。回复<aclass='referer'target='_blank'>@Archer2ee:额,hibernate注解方式没用过,以前都直接工具生成xml的,帮不上忙了嗯,没有的。hashcode和equals都没.

    2020-06-14 18:01:31
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载