@primarykeycolumn注解必须具有针对scala cassandra spring数据应用程序的分区类型

vaqhlq81  于 2021-06-14  发布在  Cassandra
关注(0)|答案(2)|浏览(682)

我正在使用scala开发cassandraspring数据模块。我已经创建了域模型和设置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中,type是一个有效的关键字,因此使用向后引号。我期待这个工作,但当我开始应用程序,但我得到了

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数据无法识别注解的类型参数。
java模型类的相同代码可以毫无问题地工作。
如果您有任何建议或替代品来解决这个问题,我们将不胜感激。

2j4z5cfb

2j4z5cfb1#

它与case类instated一起使用时工作。

@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 =_
}
llmtgqce

llmtgqce2#

实际上,除了注解之外,javabean属性是不可识别的。
scala在默认情况下不会将示例变量绑定为bean属性 case 班级。为此,您需要添加 @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, "")
}

希望这有帮助!

相关问题