java找不到当前线程的会话
我试图了解与会者的人数(一份名单,这是一个单一的课堂演示)
计划包含一个带有相应演示的OneToMany
每次我试图了解与会者的人数时,都无法延迟加载他们。我试着写一个查询,但它说我不能使用fetch两次。有没有什么好办法来获取我需要的数据
网上有很多关于这个的讨论,但似乎没有一个能解决我的问题
我运行的是hibernate的最新版本(4.1.7.Final),使用的是spring 3.2.3版
回购计划:
public interface PlanningRepository extends JpaRepository<Planning, Long>{
@Query("select pl from Planning pl join fetch pl.presentations p join fetch p.attendees a where pl.id = ?1")
Planning findOneById(Long id);
}
课堂演示中的关系:
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinTable(name = "presentation_attendees",
joinColumns = {@JoinColumn(name = "presentation_id")},
inverseJoinColumns = {@JoinColumn(name = "student_id")})
private List<Student> attendees;
学生之间的关系:
@ManyToMany(mappedBy = "attendees")
private List<Presentation> presentationsAttending;
我在PlanningController中称之为:
Planning planning = planningRepository.findOneById(1L);
JSONArray pArray = new JSONArray();
JSONObject planningJSON = new JSONObject();
//List<Presentation> presentations = (List<Presentation>)presentationRepository.findByPlanning(planning.getId());
for(Presentation p : planning.getPresentations())
{
sessionFactory.openSession();
sessionFactory.getCurrentSession().getTransaction().begin();
//i need the size of attendees
presentationJSON.put("subscribers", p.getAttendees().size());
sessionFactory.getCurrentSession().getTransaction().commit();
sessionFactory.close();
}
调度器servlet。xml:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="school"/>
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="persistenceExceptionTranslationPostProcessor" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
# 1 楼答案
奇怪的是,在方法中调用事务性方法似乎不起作用。例如,请参见