在JpaTransactionManager中未正确设置事务边界

时间:2016-03-23 06:31:00

标签: java spring hibernate jpa transactions

我正在使用JPA和Hibernate实现,并使用JpaTransactionManager来管理事务。

以下是我的申请上下文文件

<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
    <property name="persistenceXmlLocations">
        <list>
            <value>classpath*:META-INF/persistence.xml</value>
        </list>
    </property>
    <property name="defaultDataSource" ref="dataSource" />
</bean>

<bean id="entityManagerFactory" primary="true"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitManager" ref="persistenceUnitManager" />
    <property name="persistenceUnitName" value="infra_services" />
</bean>

<bean
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<tx:annotation-driven transaction-manager="transactionManager"
    proxy-target-class="true" />

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
</bean>

我已将我的服务类定义如下

@Service
@Transactional
public class ComponentService {

我在dao层执行查询,如下所示

Query q = entityManager.createQuery(
            "SELECT cc.component FROM "
                    + this.typeParameterClass.getSimpleName()
                    + " cc WHERE cc.caseload.id = ? ").setParameter(1,
            caseloadId);

    Collection<Component> ddd =q.getResultList();
    for (Component c : ddd) {
        System.out.println(c.getComponentId());
        System.out.println(c.getComponentRelationships2());
    }
    return ddd;

我从选择查询开始。执行行System.out.println(c.getComponentRelationships2());获取could not initialize proxy - no Session] with root cause例外

不确定为什么会话在这里不可用。请帮帮我。

1 个答案:

答案 0 :(得分:1)

如果您的服务与<tx:annotation-driven />的服务不在同一环境中,那么它就无法使用。因为它只在相同的上下文中查找bean。摘自spring doc:

  

@EnableTransactionManagement并且只在它们定义的相同应用程序上下文中查找bean上的@Transactional。这意味着,如果在WebApplicationContext中为DispatcherServlet添加注释驱动配置,它只检查控制器中的@Transactional bean ,而不是你的服务。有关更多信息,请参见第21.2节“DispatcherServlet”。