@PrimaryKeyColumn 注释必须具有 PARTITIONED 类型,用于 scala Cassandra Spring Data 应用程序

Posted

技术标签:

【中文标题】@PrimaryKeyColumn 注释必须具有 PARTITIONED 类型,用于 scala Cassandra Spring Data 应用程序【英文标题】:@PrimaryKeyColumn annotations must have a type of PARTITIONED for scala Cassandra Spring Data application 【发布时间】:2019-06-04 01:54:09 【问题描述】:

我正在使用 Scala 开发 Cassandra Spring-data 模块。我已经创建了域模型和设置 crud 存储库。

Spring 数据仓库设置如下:

@Repository
trait SampleRepository extends CassandraRepository[Sample, SampleKey]

表域模型设置如下:

@Table
 case class Sample(@PrimaryKey
              sampleKey: SampleKey,
              @Column("surName")
              surName: String)

主键是复合键。 Id 列作为分区键。将列命名为集群键

@PrimaryKeyClass
case class SampleKey(
                  @PrimaryKeyColumn( `type` = PrimaryKeyType.PARTITIONED, ordinal = 0, name = "id")
                  id: Int,
                  @PrimaryKeyColumn( `type` = PrimaryKeyType.CLUSTERED, ordinal = 1,  name = "name")
                  name: String
                )

在 scala 中类型是一个有效的关键字,因此使用了反向引号。我希望这可以工作,但是当我启动应用程序时,我得到了

Suppressed: org.springframework.data.mapping.MappingException: Composite primary key type [com.barclays.decisionstore.trac.model.SampleKey] has no fields annotated with @PrimaryKeyColumn
    at org.springframework.data.cassandra.core.mapping.PrimaryKeyClassEntityMetadataVerifier.verify(PrimaryKeyClassEntityMetadataVerifier.java:91)
    ... 262 common frames omitted
Suppressed: org.springframework.data.mapping.MappingException: At least one of the @PrimaryKeyColumn annotations must have a type of PARTITIONED
    at org.springframework.data.cassandra.core.mapping.PrimaryKeyClassEntityMetadataVerifier.verify(PrimaryKeyClassEntityMetadataVerifier.java:98)
    ... 262 common frames omitted

这意味着 Spring-Data 无法识别注解的类型参数。 与 java 模型类相同的代码可以正常工作。

不胜感激任何指针或替代解决这个问题。

【问题讨论】:

【参考方案1】:

实际上除了注解之外,java bean 的属性是无法识别的。

默认情况下,Scala 不会将实例变量绑定为 case 类的 bean 属性。为此,您需要为每个属性添加 @BeanProperty 注释。

import scala.beans.BeanProperty

@PrimaryKeyClass
case class SampleKey(@BeanProperty
                     @PrimaryKeyColumn(`type` = PrimaryKeyType.PARTITIONED, ordinal = 0, name = "id")
                     id: Int,
                     @BeanProperty
                     @PrimaryKeyColumn(`type` = PrimaryKeyType.CLUSTERED, ordinal = 1, name = "name")
                     name: String)

此外,如果您遇到对象构造错误,请添加具有默认值的构造函数(这需要创建变量var):

@PrimaryKeyClass
case class SampleKey(@BeanProperty
                     @PrimaryKeyColumn(`type` = PrimaryKeyType.PARTITIONED, ordinal = 0, name = "id")
                     var id: Int,
                     @BeanProperty
                     @PrimaryKeyColumn(`type` = PrimaryKeyType.CLUSTERED, ordinal = 1, name = "name")
                     var name: String) 
  def this() = this(0, "")

希望这会有所帮助!

【讨论】:

感谢您的帮助。实际上,我想创建与 spring-data 兼容的简单 pojo。 class 是比 case class 更好的选择。 顺便说一句,如果您需要比较对象,您可以免费获得equalshashCodetoString 的案例类(它们将由scala 自动生成)。使用类,您需要自己实现它们。注释起初看起来很难看,但在我看来,数据对象的好处要多得多。【参考方案2】:

它在与 class 设置为 case class 一起使用时起作用。

@PrimaryKeyClass
class SimpleKey

 @PrimaryKeyColumn( `type` = PrimaryKeyType.PARTITIONED, ordinal = 0, name = "id")
 var id: Int =_ 
 @PrimaryKeyColumn( `type` = PrimaryKeyType.CLUSTERED, ordinal = 1,  name = "name")
 var name: String =_

【讨论】:

以上是关于@PrimaryKeyColumn 注释必须具有 PARTITIONED 类型,用于 scala Cassandra Spring Data 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

jpa 2.0 对具有 2 个 ID 的类的注释,指向两个不同的表

数据注释/验证和动态值

java 注释规范 参照

shell编程

为什么我们想在具有互斥锁的情况下使函数递归?

迭代具有特定注释的所有类[重复]