org.hibernate.LazyInitializationException异常问题

Archer2ee 发布于 2015/02/03 14:52
阅读 1K+
收藏 0

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)



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







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