有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    奇怪的是,在方法中调用事务性方法似乎不起作用。例如,请参见

    @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");
        }       
    }