Code Bye

关于hibernate 双向one to many 获取many问题求教.

one获取数据时默认是不主动获取many的
one简单代码:
public class Subject implements Serializable{
   private Set<Reply> replys = new HashSet<Reply>();
     //get set…
     @OneToMany(mappedBy = “subject”, targetEntity = Reply.class, cascade = {
CascadeType.PERSIST, CascadeType.REFRESH,CascadeType.REMOVE})
public Set<Reply> getReplys() {
return replys;
}
}

many简单代码:
public class Reply  implements Serializable{
      private Subject subject;
     //get set…
@ManyToOne
@JoinColumn(name=”subject_id”,nullable=false)
public Subject getSubject() {
return subject;
}
}

test代码:
@Test
public void testGetReply() {
act = new ClassPathXmlApplicationContext(“beans.xml”);
SubjectDao subjectDao = (SubjectDao) act.getBean(“subjectDaoImpl”);
[color=#000080] Subject subject = subjectDao.get(1);
                //  對應的get 方法代碼 return (Subject) getHibernateTemplate().get(Subject.class, id);

Set<Reply> replys = subject.getReplys(); 
               //在這里就報錯了,
System.out.println(replys);[/color]

      /*   Iterator<Reply> replyIt = replys.iterator();
while(replyIt.hasNext()){
Reply reply = replyIt.next();
System.out.println(reply);
reply.getContent();
reply.getDate();
}*/

}
[color=#000000]org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: cc.blogs.domain.Subject.replys, no session or session was closed[/color]
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372)
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365)
at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:108)
at org.hibernate.collection.PersistentSet.toString(PersistentSet.java:332)
at java.lang.String.valueOf(Unknown Source)
at java.io.PrintStream.println(Unknown Source)
at cc.blogs.junit.SubjectDaoTest.testGetReply(SubjectDaoTest.java:43)
……………………………………………………………

有什麽辦法獲取many 而又 不設置 one获取数据时主动获取many,

我試了下設置:OpenSessionInViewFilter,可還是報錯…求解,深表感謝!

你现在用Junit单元测试也会报错吗?
你的Hibernate版本是多少?

40分
你用的junit测试,异常信息里的“session was closed”跟有没有开启“OpenSessionInViewFilter”没关系啊,“OpenSessionInViewFilter”只有通过网页访问的时候才起作用。所以问题很明显了,就是因为你用的spring管理的session,所以spring在查询完成后就把session关闭了。spring管理session的原则是:在哪里打开的,就在哪里关闭,不需要用户自己打开或者关闭。
默认加载多方是懒加载,除非强制指定:
fetch=FetchType.EAGER

@OneToMany(mappedBy = “subject”, fetch=FetchType.EAGER,targetEntity = Reply.class, cascade = {CascadeType.PERSIST, CascadeType.REFRESH,CascadeType.REMOVE})

谢谢3楼,
我知道问题出在那,主要还是想问下
有什麽辦法獲取many 而又不設置 one获取数据时主动获取many(就是不指定fetch=FetchType.EAGER,,如4楼所说..),

40分
引用 5 楼 u011008051 的回复:

谢谢3楼,
我知道问题出在那,主要还是想问下
有什麽辦法獲取many 而又不設置 one获取数据时主动获取many(就是不指定fetch=FetchType.EAGER,,如4楼所说..),

要看事务边界,貌似是直接测试dao层,事务是不是放在service层?如果是,将测试类继承AbstractTransactionalJUnit4SpringContextTests,并在测试类上配置@TransactionConfiguration(transactionManager = “transactionManager”, defaultRollback = false)和@Transactional。

引用 5 楼 u011008051 的回复:

谢谢3楼,
我知道问题出在那,主要还是想问下
有什麽辦法獲取many 而又不設置 one获取数据时主动获取many(就是不指定fetch=FetchType.EAGER,,如4楼所说..),

不明白你想表达什么,默认就是懒加载调用get many方法时候才会去查many集合。

如果不想在获取many集合的时候每个many对象又去反查一遍one的话,可以查查有个配置大概@ignorexxx这个的,我记不清了

六楼的你可以测试看下,如果确实有这种用法的话,应该可以达到你的目的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于hibernate 双向one to many 获取many问题求教.