Hi,大家好!今天遇到org.hibernate.LazyInitializationException这个异常,百思不得解,所以来请教下。我的Hibernate是3.5.6-Final,Spring是3.1.2.RELEASE。
首先我有三个Entity:MailingWayEntity(简写为A)、MailingWayPriceEntity(B)、MailingWayLinkEntity(C)。其中A跟B是一对多的关系,前者是一方,B跟C 也是一对多的关系,前者是一方。
在MailingWayEntity(A)中这么定义多方:
/** * 报价单 */ @OneToMany(mappedBy = "mailingWay") @Cascade(value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE}) private Set<MailingWayPriceEntity> mailWayPrice = new HashSet<MailingWayPriceEntity>();
/** * 邮寄方式 */ @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是需要帮我加载数据的,可是现在它还是抛异常了,肯定是哪里出问题,特来请教下大家。先谢了。
抛什么异常要贴出来吧,不然怎么看啊。嗯贴出来了。似乎是和你使用hashset有关,看下你的entity是否有覆盖hashCode方法?两边的fetch都设置为lazy。就可以。不过还是对实现不清不楚。没事,我再看看!非常感谢你的帮忙。回复<aclass='referer'target='_blank'>@Archer2ee:额,hibernate注解方式没用过,以前都直接工具生成xml的,帮不上忙了嗯,没有的。hashcode和equals都没.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。