0

プロジェクトをdbに接続しようとしています。既に接続されており、このデータベースで動作するプロジェクトが 1 つあります。そして、2番目のものと、jmsを使用したそれらの間の通信が必要です。同じデータベースに接続するように secon を構成しましたが、動作しません。まあ接続はOKです。Entity クラスを作成すると、db に新しいテーブルが表示されます。とても素晴らしい。しかし、エンティティマネージャーを挿入する必要があるコントローラーを作成しましたが、常に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();
}

}

そして、ここにリポジトリがあります:

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

}
4

3 に答える 3

8

クラスLocalContainerEntityManagerFactoryBeanはファクトリーです。メソッドと. _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();
}
于 2013-06-12T15:43:40.310 に答える
1

私が見るところ、あなたは をインスタンス化するだけで をインスタンス化しEntityManagerFactoryていないEntityManagerので、 を注入するEntityManagerFactoryEntityManager、起動時に注入できる をインスタンス化する必要があります。

また、トランザクションやさまざまな環境に関連する EM の注入に関して、この投稿で説明されている問題にも注意してください。

于 2013-06-12T14:43:27.187 に答える
0

問題は、 にJpaTransactionManagerへの参照がないことEntityManagerFactoryです。コンストラクター注入またはセッター注入のいずれかを使用して解決します。

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

また

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

参照、Spring リファレンス ドキュメントのJPA トランザクション パラグラフJpaTransactionManagerの XML アプリケーション コンテキストには、対応する構成があります。

于 2013-06-12T18:04:59.080 に答える