2015-12-23 4 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 и лениво загружается.Весна Данные lazyload не LazyInitializationException

В приведенном выше коде

classARepo.findOne(1); 

Выполнение правильно. но

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

Fails with LazyInitializationException.

Instance для Теста создается как один ниже

@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> 
     } 
    } 
Смежные вопросы