2013-06-12 4 views
0

내 프로젝트를 db에 연결하려고합니다. 나는 이미 연결되어 있고이 db에서 작동하는 하나의 프로젝트를 가지고 있습니다. 그리고 jms를 사용하여 둘 사이의 통신과 통신이 필요합니다. 나는 secon을 동일한 db에 연결하도록 구성했으며 작동하지 않습니다. 잘 연결은 괜찮습니다. Entity 클래스를 만들면 db로 새 테이블을 볼 수 있습니다. 그래서 큰. 하지만 엔티티 관리자를 삽입해야하는 제어기를 작성했는데 항상 null입니다. 나는 이유를 모른다. 여기 내 설정입니다. 여기 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; 
    } 

} 

는 관리자 구성 장치입니다 :

@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(); 
} 

} 

그리고 여기 저장소입니다 : 당신은 단지 EntityManagerFactory 아닌 EntityManager를 인스턴스화하는 무엇을보고에서

@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을 주입하십시오.

트랜잭션 및 다른 환경과 관련하여 EM을 주입하는 것과 관련된 게시물에 대해서는 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이 필요합니다.

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

내 하루를 저장했습니다. 감사! –

0

문제는 JpaTransactionManagerEntityManagerFactory에 참조가되도록한다. 이를 해결하기 위해 생성자 주입 또는 세터 주입 하나를 사용

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

또는

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

참조 스프링 참조 문서의 JPA Transaction paragraph의 XML 애플리케이션 컨텍스트에서 JpaTransactionManager는 해당 구성을 갖는다.

관련 문제