2013-06-12 4 views
0

Я пытаюсь подключить свой проект с db. У меня есть один проект, который уже подключен и работает на этом db. И мне нужен второй и связь между ними, используя jms. Я настраиваю secon для подключения к тому же db, и он не работает. Ну соединение нормально. Когда я создаю класс Entity, то в db я вижу новую таблицу. Так здорово. Но я написал контроллер, который должен вводить менеджер сущностей, и он всегда равен нулю. У меня нет идеи, почему. Вот мой конфиг.EntityManager имеет значение null. Не удается ввести

@Configuration 
@ComponentScan(basePackages = { "**.*****.**********" }) 
public class CalculationWorkerRootConfig { 

    @Bean 
    public static PropertyPlaceholderConfigurer propertyPlaceholderConfigurer() { 
     PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer(); 
     ppc.setLocation(new ClassPathResource("/persistence.properties")); 
     return ppc; 
    } 

} 

Вот менеджер configurer:

@Configuration 
@EnableTransactionManagement 
@EnableJpaRepositories 
public class CalculationWorkerPersistenceConfig implements TransactionManagementConfigurer { 

    @Value("${dataSource.driverClassName}") 
    private String driver; 
    @Value("${dataSource.url}") 
    private String url; 
    @Value("${dataSource.username}") 
    private String username; 
    @Value("${dataSource.password}") 
    private String password; 
    @Value("${hibernate.dialect}") 
    private String dialect; 
    @Value("${hibernate.hbm2ddl.auto}") 
    private String hbm2ddlAuto; 

@Bean 
public DataSource configureDataSource() { 
    DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
    dataSource.setDriverClassName(driver); 
    dataSource.setUrl(url); 
    dataSource.setUsername(username); 
    dataSource.setPassword(password); 
    return dataSource; 
} 

@Bean 
public LocalContainerEntityManagerFactoryBean configureEntityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
    entityManagerFactoryBean.setDataSource(configureDataSource()); 
    entityManagerFactoryBean.setPackagesToScan("**.*********.************"); 
    entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 

    Properties jpaProperties = new Properties(); 
    jpaProperties.put(org.hibernate.cfg.Environment.DIALECT, dialect); 
    jpaProperties.put(org.hibernate.cfg.Environment.HBM2DDL_AUTO, hbm2ddlAuto); 
    entityManagerFactoryBean.setJpaProperties(jpaProperties); 

    return entityManagerFactoryBean; 
} 

@Bean 
public PlatformTransactionManager annotationDrivenTransactionManager() { 
    return new JpaTransactionManager(); 
} 

} 

А вот репозиторий:

@Repository 
@Transactional(readOnly = true) 
public class CalculationWorkerRepository { 

@PersistenceContext 
EntityManager entityManager; 


public Campaign findByID(Long id) { 
    return entityManager.find(Campaign.class, id); 
} 

@Transactional 
public void setCalculating(Boolean calculating, Long campaignID) { 
    Campaign campaign = findByID(campaignID); 
    campaign.setCalculating(calculating); 
} 

} 
+0

Можете ли вы показать контроллер? –

ответ

1

Из того, что я вижу, вы только инстанцировании в EntityManagerFactory, а не EntityManager, так как у вас есть для ввода EntityManagerFactory или установки EntityManager при запуске, который может быть введен.

Также обратите внимание на проблемы, описанные в статье this, относительно введения ЭМ в отношении транзакций и различных сред.

5

Класс LocalContainerEntityManagerFactoryBean является фабрикой. Вы можете заметить из javadoc, что он расширяет AbstractEntityManagerFactoryBean, который предоставляет методы afterPropertiesSet() и getObject(). Вы должны вызвать их, чтобы создать экземпляр EntityManagerFactory.

@Bean 
public EntityManagerFactory configureEntityManagerFactory() { 
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
    entityManagerFactoryBean.setDataSource(configureDataSource()); 
    entityManagerFactoryBean.setPackagesToScan("**.*********.************"); 
    entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 

    Properties jpaProperties = new Properties(); 
    jpaProperties.put(org.hibernate.cfg.Environment.DIALECT, dialect); 
    jpaProperties.put(org.hibernate.cfg.Environment.HBM2DDL_AUTO, hbm2ddlAuto); 
    entityManagerFactoryBean.setJpaProperties(jpaProperties); 

    entityManagerFactoryBean.afterPropertiesSet(); 
    return (EntityManagerFactory) entityManagerFactoryBean.getObject(); 
} 

Вышеуказанное создаст EntityManagerFactory. Затем вам понадобится фасоль EntityManager.

@Bean 
public EntityManager entityManager() { 
    return configureEntityManagerFactory.createEntityManager(); 
} 
+0

Сохраненный мой день. Благодаря! –

0

Проблема заключается в том, что JpaTransactionManager отсутствует ссылку на EntityManagerFactory. Используйте либо инъекции конструктора или сеттер инъекции решить:

@Bean 
public PlatformTransactionManager annotationDrivenTransactionManager() { 
    return new JpaTransactionManager(configureEntityManagerFactory()); 
} 

или

@Bean 
public PlatformTransactionManager annotationDrivenTransactionManager() { 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(configureEntityManagerFactory()); 
    return transactionManager; 
} 

справки, JpaTransactionManager в контексте приложения XML в JPA Transaction paragraph в Спринг справочной документации имеет соответствующую конфигурацию.

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