2015-12-23 19 views
1
@Component 
@Transactional 
public class TestClass extends AbstractClass 
{ 
    @Autowire 
    ClassARepo classARepo; 

    @Override 
    public void test() { 
     ClassA classA = classARepo.findOne(1); 
     List<ClassB> list = classA.getClassBs(); 
     list.size(); 
    } 
} 

ClassB被映射为onetomany并且被延迟加载。Spring Data lazyload不LazyInitializationException

在上面的代码

classARepo.findOne(1); 

正确执行。但是

List<ClassB> list = classA.getClassBs(); 
list.size(); 

因LazyInitializationException失败。

的种皮

实例被创建像下面

@PersistJobDataAfterExecution 
@DisallowConcurrentExecution 
@Transactional 
@Component 
public class TestClassJOB extends AbstractJob 
{ 
    @Autowired 
    TestClass indexer; 
} 

背景下的一个:

<!-- JPA mapping configuration --> 
<bean id="persistenceXmlLocation" class="java.lang.String"> 
    <constructor-arg value="classpath:/persistence.xml"></constructor-arg> 
</bean> 

<!-- entity manager --> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
    p:dataSource-ref="dataSource" p:persistenceUnitName="jpaData" 
    p:persistenceXmlLocation-ref="persistenceXmlLocation"> 
    <property name="packagesToScan" value="com..persist.entity" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
    </property> 
</bean> 

<!-- transaction manager --> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" 
    p:entityManagerFactory-ref="entityManagerFactory" lazy-init="true" p:dataSource-ref="dataSource" /> 

<!-- JPA repositories --> 
<jpa:repositories base-package="com..persist.repo" 
    entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager" /> 

我试了很多资源,解决不了问题。将显示以下错误消息“无法初始化代理 - 没有会话”。

问题的原因是什么? 当调用classARepo.findOne(1)时会话可用时,为什么在懒取(list.size())期间不可用?

+0

代码显示ClassARepo的代码固定的问题。显示你如何获得TestClass的一个实例。显示你的上下文是如何配置的。 –

+0

@JBNizet我已添加请求的详细信息 – Edi

+0

您介意向我们展示方法'findOne'的代码吗?也许你在返回对象后关闭会话。 –

回答

1

问题是TestClassJOB的实例是由Quartz创建的。所以跨国代理并不适用于这个问题的原因。

我声明了一个交易模板

@Autowired 
TransactionTemplate transactionTemplate; 

,然后包裹内

transactionTemplate.execute(new TransactionCallbackWithoutResult() 
    { 
     @Override 
     protected void doInTransactionWithoutResult(TransactionStatus status) 
     { 
      <code here> 
     } 
    }