Spring Kotlin环境下创建Cassandra表失败,请求排查问题原因
问题分析:Cassandra表不存在异常
错误信息
Caused by: org.springframework.data.cassandra.CassandraInvalidQueryException: Query; CQL [TRUNCATE ingredients]; table ingredients does not exist
相关代码
实体类代码
@Data @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE, force = true) @Table("ingredients") data class Ingredients( @PrimaryKey val id: String, val name: String, val type: Type )
UDT代码
@Data @RequiredArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE, force = true) @UserDefinedType("ingredients") data class IngredientUDT( var name: String, var type: Type )
配置类代码
@Configuration @EnableCassandraRepositories class DataInitializer: AbstractCassandraConfiguration() { @Primary fun cqlSession(): CqlSession { return CqlSession.builder().build() } override fun getKeyspaceName(): String { return "tacocloud" } override fun getEntityBasePackages(): Array<String> { return arrayOf("sia.tacocloud") } @Bean fun dataLoader(repo: IngredientsRepository): ApplicationRunner { return ApplicationRunner { repo.deleteAll() repo.save(Ingredients("FLTO", "Flour Tortilla", Type.WRAP)) repo.save(Ingredients("COTO", "Corn Tortilla", Type.WRAP)) repo.save(Ingredients("GRBF", "Ground Beef", Type.PROTEIN)) repo.save(Ingredients("CARN", "Carnitas", Type.PROTEIN)) repo.save(Ingredients("TMTO", "Diced Tomatoes", Type.VEGGIES)) repo.save(Ingredients("LETC", "Lettuce", Type.VEGGIES)) repo.save(Ingredients("CHED", "Cheddar", Type.CHEESE)) repo.save(Ingredients("JACK", "Monterrey Jack", Type.CHEESE)) repo.save(Ingredients("SLSA", "Salsa", Type.CHEESE)) repo.save(Ingredients("SRCR", "Sour Cream", Type.CHEESE)) } } }
配置文件内容
#Cassandra settings spring.data.cassandra.keyspace-name = tacocloud spring.data.cassandra.schema-action = RECREATE spring.data.cassandra.local-datacenter = datacenter1 basic.load-balancing-policy.local-datacenter = datacenter1 spring.data.cassandra.contact-points=127.0.0.1 spring.data.cassandra.port=9042 spring.data.cassandra.username = *** spring.data.cassandra.password = ***
问题原因
- 命名冲突:同一keyspace下,UDT和表的名称不能重复。你用
@UserDefinedType("ingredients")定义了名为ingredients的UDT,同时又用@Table("ingredients")定义了同名的实体表,导致Spring Data Cassandra无法正常创建表。 - 会话配置不匹配:配置类中重写的
cqlSession()方法直接创建默认会话,没有使用配置文件中的用户名、密码、数据中心等参数,可能导致会话连接的配置与预期不符,进一步阻碍表的自动创建。
内容的提问来源于stack exchange,提问作者Saher Al-Sous
相关产品推荐
相关产品推荐

