簡體   English   中英

找不到當前線程的會話

[英]No Session found for current thread

我正在嘗試增加與會者的人數(列表,這是在Presentation中的一個toToy列表)

計划包含一個OneToMany及其相應的演示文稿

每次我嘗試獲得與會人員的人數時,都無法延遲加載它們。 我嘗試編寫查詢,但是它說我不能使用兩次提取。 有什么好的方法來獲取我需要的數據嗎?

互聯網上對此有很多討論,但似乎都沒有解決我的問題。

我正在最新版本的hibernate(4.1.7.Final)上運行,並且正在使用Spring Release 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"/>

您需要將您的存儲庫調用括在Service方法中。

例如: -

PresentationService

@Transactional
public List<Long> getAttendeesCountForPlanning(Long planningId) {
    ... 
}

這必須返回每個計划ID的“出席者計數列表”。 因此,這將包含在單個事務中。 有關更多信息,請閱讀此帖子

我通過將ManyToMany和OneToMany關系上的List <>更改為Set <>來解決此問題

奇怪的是,在該方法中調用事務方法似乎無效。 例如,請參閱

@Service       
public class MyServiceImpl implements MyService{

    @Autowired
    MyDAO myDAO;


    @Override
    @Transactional(readOnly=true)
    public MyObject method1(String param) {

        return MyObject myObject = myDAO.get(param);
    }       


    @Override
        //Won't work without the transactional annotation
    public MyObject method2() {

              return method1("bla");
    }       
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM