0

我正在尝试在 Spring Boot 上为 Cassandra 配置 hibernate-ogm,但是没有向 entityManager 提供透明的数据源,并且运行时出现以下错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration required a bean of type 'javax.sql.DataSource' that could not be found.
    - Bean method 'dataSource' not loaded because @ConditionalOnProperty (spring.datasource.jndi-name) did not find property 'jndi-name'
    - Bean method 'dataSource' not loaded because @ConditionalOnBean (types: org.springframework.boot.jta.XADataSourceWrapper; SearchStrategy: all) did not find any beans


Action:

Consider revisiting the conditions above or defining a bean of type 'javax.sql.DataSource' in your configuration.

为案例吹一个工作流程:

从在 spring 上禁用相关 jpa 的自动配置开始:

@Configuration
@ComponentScan
@EnableAutoConfiguration(exclude = {
        DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class
})
public class GsDataApplication {
    public static void main(String[] args) {
        SpringApplication.run(GsDataApplication.class, args);
    }
}

和项目依赖项是:

dependencies {
    compile project(':shared')

    compile('joda-time:joda-time:2.9.4')
    //compile('org.hibernate:hibernate-core:5.2.2.Final')
    compile('org.hibernate.ogm:hibernate-ogm-cassandra:5.0.1.Final')
    compile('org.hibernate:hibernate-search-orm:5.5.4.Final')
    compile('javax.transaction:jta:1.1')
    compile('org.springframework.data:spring-data-jpa:1.10.4.RELEASE')
    compile('org.springframework.boot:spring-boot-starter-social-facebook')
    compile('org.springframework.boot:spring-boot-starter-social-twitter')
}

持久化配置:

@Configuration
@EnableJpaRepositories(basePackages = {
        "com.gs.gsData.identity"
})
@EnableTransactionManagement
class PersistenceContext {
    @Bean
    LocalContainerEntityManagerFactoryBean entityManagerFactory(Environment env) {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        entityManagerFactoryBean.setPackagesToScan("com.gs.gsData.domain");

        Properties jpaProperties = new Properties();
        jpaProperties.put("javax.persistence.transactionType", "resource_local");
        jpaProperties.put("hibernate.ogm.datastore.provider", "cassandra_experimental");
        jpaProperties.put("hibernate.ogm.datastore.host", "127.0.0.1");
        jpaProperties.put("hibernate.ogm.datastore.port", "9042");
        jpaProperties.put("hibernate.ogm.datastore.database", "db-name");
        jpaProperties.put("hibernate.ogm.datastore.username", "cassandra");
        jpaProperties.put("hibernate.ogm.datastore.password", "password");
        jpaProperties.put("hibernate.ogm.datastore.create_database", "true");

        entityManagerFactoryBean.setPersistenceProviderClass(HibernateOgmPersistence.class);
        entityManagerFactoryBean.setJpaProperties(jpaProperties);

        return entityManagerFactoryBean;
    }

    @Bean
    JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    }
}

实体样本

@Entity
@Data
@AllArgsConstructor
@Table(name = "`User`")
public class User extends AbstractTiming{
    @Id @GeneratedValue
    private Long id;
    private String firstName, lastName, description;

    public User(){}
}

ADO @Repository

public interface UserDAO extends JpaRepository<User, Long> {
    User findByFirstName(String firstName);
    List<User> findByLastName(String lastName);
}

那么到底有没有办法创建DataSource来引用Hibernate OGM呢?

或任何其他避免直接 dataSource 提供程序的操作。任何帮助是极大的赞赏!

4

1 回答 1

0

Hibernate OGM 将连接存储在它自己的类中:org.hibernate.ogm.datastore.spi.DatastoreProvider.

所以在启动时它不处理DataSources,不确定是否有办法从cassandra连接创建一个DataSource并将其添加到JNDI中以便springboot找到它。

原因是目前 NoSQL 数据存储之间没有定义连接细节的标准。

于 2016-11-14T12:57:34.380 回答