2016-02-15 2 views
0

В настоящее время я реализую Spring-пакет, который читает и записывает файлы, но также должен выполнять операции CRUD в базе данных.Spring-пакетный Entity Manager становится null после инициализации

Я попытался просто определить менеджера Entity в моей конфигурации xml и использовать его в своем классе DAO. Однако сразу после инициализации EntityManager становится нулевым.

Может ли кто-нибудь помочь мне с этим? (решение или связь через что-то пригодное для использования было бы идеальным).

Мои batchContext.xml

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${batch.datasource.driverClassName}"/> 
    <property name="url" value="${batch.datasource.url}"/> 
    <property name="username" value="${batch.datasource.username}"/> 
    <property name="password" value="${batch.datasource.password}"/> 
    <property name="testOnBorrow" value="true"/> 
    <property name="testOnReturn" value="true"/> 
    <property name="testWhileIdle" value="true"/> 
    <property name="timeBetweenEvictionRunsMillis" value="1800000"/> 
    <property name="numTestsPerEvictionRun" value="3"/> 
    <property name="minEvictableIdleTimeMillis" value="1800000"/> 
</bean> 

<bean id="entityManagerFactory" name="entTransactionMgr" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <!-- <property name="persistenceXmlLocation" value="classpath:/META-INF/spring/persistence.xml" /> --> 
    <property name="persistenceUnitName" value="persistenceUnit"/> 
    <property name="packagesToScan" value="${jpa.scan.packages}"/> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
    <property name="loadTimeWeaver"> 
     <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 
    </property> 

    <!-- Custom jpaDialect pour le deuxieme batch:job-repository--> 
<property name="jpaDialect"> 
    <bean class="fr.mma.soecm.batchfacade.util.CustomHibernateJpaDialect" /> 
</property> 
    <property name="jpaProperties"> 
     <props> 
      <!-- multiple props here--> 
     </props> 
    </property> 
</bean> 

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

<!-- mode="aspectj" --> 
<tx:annotation-driven transaction-manager="transactionManager"/> 

<batch:job-repository id="jobRepository" data-source="dataSource" transaction-manager="transactionManager"/> 

<!-- Jobs held separatelly --> 
<import resource="batchContext-job.xml"/> 

Мой DAO

@Repository("batchJobDao") 
@Transactional 
public class BatchJobDaoImpl implements BatchJobDao{ 

@PersistenceContext(unitName="persistenceUnit") 
@Autowired 
private EntityManager entityManager; 

// @PersistenceContext(unitName="persistenceUnit", type=PersistenceContextType.EXTENDED) 
// public void setEntityManager(EntityManager entityManager) { 
//  System.out.println("Setting Entity Manager :" + entityManager); 
//  this. entityManager = entityManager; 
// } 

@PostConstruct 
public void init(){ 
    if (entityManager == null){ 
     System.out.println(" Entity Manager is null"); 
    } else { 
     System.out.println(" Entity Manager is not null"); 
     getAllJobExecutions(); 
    } 
} 

private static final String RECHERCHER_JOB_EXECUTION = "Select bje from BatchJobExecution bje"; 

@SuppressWarnings("unchecked") 
@Override 
@Transactional("transactionManager") 
public List<BatchJobExecution> getAllJobExecutions(){ 

//  EntityManagerFactory emf=Persistence.createEntityManagerFactory("entTransactionMgr"); 
//  EntityManager em=emf.createEntityManager(); 

    Query query = entityManager.createQuery(RECHERCHER_JOB_EXECUTION, BatchJobExecution.class); 
    List<BatchJobExecution> executions = (List<BatchJobExecution>) query.getResultList(); 
    System.out.println("EXES : " + executions); 
    return executions; 
} 
} 

Существует некоторый код заметил, потому что я пытался несколько aproaches (изменение типа контекста сохранение, восстановление диспетчер сущностей «вручную ", имеющий файл persistence.xml для entityManager) без succes.

Мой выход при выполнении задания является (без всех дополнительных линий ..):

Entity Manager is not null 
EXES : [[email protected],...] 
[BatchService] - Synchronous job launch 
[AbstractStep] - Encountered an error executing the step 
Caused by: java.lang.NullPointerException 

И нулевой указатель, на отладку, это бросает на нуль будучи EntityManager, когда я называю «CreateQuery» в моем DAO.

Благодарим за помощь. Я продолжу поиски на своем конце. Божья скорость!

+0

Это не может быть «null» (при условии, что у вас есть либо '', либо ''!) Весна выкинет исключение при запуске. Это будет только «null» с неправильной конфигурацией (т. Е. Без обработки аннотаций) или если вы сами создаете экземпляры. –

+0

Я думаю, что понял. Он возвращает null, когда я вызываю его из конструктора, но когда я его ударяю другим методом. В моем случае «doRead» работает так, как ожидалось. Я проверю все методы CRUD и подтвержу. Кажется, каждый раз, когда я отправляю что-то здесь, я его исправляю через 5 минут после .. :) – pegas

ответ

0

Как уже упоминалось выше, моя проблема была связана с тем, что я пытался вызвать службу или DAO в конструкторе Step.

После перемещения вызова службы в методе doRead(), я мог выполнять все операции CRUD с EntityManager.

Пожалуйста, дайте мне знать, если у кого есть вопросы об этом/и о том, как заставить его работать в противном случае, поскольку я не нашел никаких объяснений в Интернете, так как я начал искать на прошлой неделе.

Смежные вопросы