You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot多Cassandra连接报错:unconfigured table(表实际存在)

Spring Boot多Cassandra数据库连接:解决'unconfigured table'错误

问题描述

在Spring Boot应用中配置了两个Cassandra数据库连接,对应CassandraConfig1和CassandraConfig2两个配置类,分别绑定repo1和repo2路径下的仓库。但使用repo2中的仓库执行查询时,出现unconfigured table错误,尽管目标表确实存在于对应数据库的Keyspace中。

现有配置代码

Config 1

@Configuration
@EnableCassandraRepositories(basePackages = "com.example.microservice.cloud.dao.repo1")
public class CassandraConfig1 extends AbstractCassandraConfiguration {

    @Override
    protected String getKeyspaceName() {
        return keySpace;
    }

    @Override
    protected String getContactPoints() {
        return contactPoints;
    }

    @Override
    protected int getPort() {
        return PORT;
    }

    @Bean()
    @Primary
    public CqlSessionFactoryBean cassandraMapSession() {
        final CqlSessionFactoryBean cqlSessionFactoryBean = super.cassandraSession();
        cqlSessionFactoryBean.setContactPoints(contactPoints);
        cqlSessionFactoryBean.setKeyspaceName(keySpace);
        cqlSessionFactoryBean.setPort(PORT);
        cqlSessionFactoryBean.setUsername(cassandraUsername);
        cqlSessionFactoryBean.setPassword(cassandraPassword);
        return cqlSessionFactoryBean;
    }

    @Override
    public CqlSessionFactoryBean cassandraSession() {
        return cassandraMapSession();
    }
}

Config 2

@Configuration
@EnableCassandraRepositories(basePackages = "com.example.microservice.cloud.dao.repo2")
public class CassandraConfig2 extends AbstractCassandraConfiguration {

    @Override
    protected String getKeyspaceName() {
        return keySpace;
    }

    @Override
    protected String getContactPoints() {
        return contactPoints;
    }

    @Override
    protected int getPort() {
        return PORT;
    }

    @Bean()
    public CqlSessionFactoryBean cassandraMapSession() {
        final CqlSessionFactoryBean cqlSessionFactoryBean = super.cassandraSession();
        cqlSessionFactoryBean.setContactPoints(contactPoints);
        cqlSessionFactoryBean.setKeyspaceName(keySpace);
        cqlSessionFactoryBean.setPort(PORT);
        cqlSessionFactoryBean.setUsername(cassandraUsername);
        cqlSessionFactoryBean.setPassword(cassandraPassword);
        return cqlSessionFactoryBean;
    }

    @Override
    public CqlSessionFactoryBean cassandraSession() {
        return cassandraMapSession();
    }
}

问题根源

  1. 两个配置类都重写了cassandraSession()方法,且Config2的Session Bean没有唯一标识,导致Spring无法区分两个Session工厂。
  2. @EnableCassandraRepositories未明确指定对应的Session工厂,repo2的仓库可能默认使用了Config1的@Primary Session,连接到错误的Keyspace,从而找不到目标表。

修复方案

步骤1:为Config2的Session Bean指定唯一名称

在Config2的cassandraMapSession方法上添加唯一Bean名称:

@Bean("cassandraSession2")
public CqlSessionFactoryBean cassandraMapSession() {
    // 原有代码不变
}

步骤2:绑定仓库到对应Session工厂

修改Config2的@EnableCassandraRepositories注解,指定sessionFactoryRef指向刚才定义的Bean:

@EnableCassandraRepositories(
    basePackages = "com.example.microservice.cloud.dao.repo2",
    sessionFactoryRef = "cassandraSession2"
)

步骤3:移除冗余的cassandraSession()重写

删除两个配置类中的cassandraSession()重写方法,AbstractCassandraConfiguration会自动使用自定义的CqlSessionFactoryBean,避免逻辑混淆。

修改后的Config2完整代码

@Configuration
@EnableCassandraRepositories(
    basePackages = "com.example.microservice.cloud.dao.repo2",
    sessionFactoryRef = "cassandraSession2"
)
public class CassandraConfig2 extends AbstractCassandraConfiguration {

    @Override
    protected String getKeyspaceName() {
        return keySpace;
    }

    @Override
    protected String getContactPoints() {
        return contactPoints;
    }

    @Override
    protected int getPort() {
        return PORT;
    }

    @Bean("cassandraSession2")
    public CqlSessionFactoryBean cassandraMapSession() {
        final CqlSessionFactoryBean cqlSessionFactoryBean = super.cassandraSession();
        cqlSessionFactoryBean.setContactPoints(contactPoints);
        cqlSessionFactoryBean.setKeyspaceName(keySpace);
        cqlSessionFactoryBean.setPort(PORT);
        cqlSessionFactoryBean.setUsername(cassandraUsername);
        cqlSessionFactoryBean.setPassword(cassandraPassword);
        return cqlSessionFactoryBean;
    }
}

额外检查项

  • 确认Config2中的keySpace变量值正确指向包含目标表的Keyspace
  • 验证数据库账号拥有该Keyspace的读写权限
  • 检查实体类的@Table注解是否指定了正确的Keyspace(若未继承配置类的Keyspace设置)

内容的提问来源于stack exchange,提问作者Vishwanath M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:05:58