CassandraReporitory の findOne() または findAll() メソッドを使用すると、次の例外が発生します。
Caused by: java.lang.IllegalStateException: property does not have a single column mapping
at org.springframework.data.cassandra.mapping.BasicCassandraPersistentProperty.getColumnName(BasicCassandraPersistentProperty.java:134)
at org.springframework.data.cassandra.convert.BasicCassandraRowValueProvider.getPropertyValue(BasicCassandraRowValueProvider.java:64)
at org.springframework.data.cassandra.convert.BasicCassandraRowValueProvider.getPropertyValue(BasicCassandraRowValueProvider.java:35)
at org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:78)
at org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:71)
at org.springframework.data.convert.ClassGeneratingEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:83)
at org.springframework.data.cassandra.convert.MappingCassandraConverter.readEntityFromRow(MappingCassandraConverter.java:133)
at org.springframework.data.cassandra.convert.MappingCassandraConverter.readRow(MappingCassandraConverter.java:115)
at org.springframework.data.cassandra.convert.MappingCassandraConverter.read(MappingCassandraConverter.java:200)
at org.springframework.data.cassandra.repository.query.AbstractCassandraQuery.getSingleEntity(AbstractCassandraQuery.java:176)
at org.springframework.data.cassandra.repository.query.AbstractCassandraQuery.execute(AbstractCassandraQuery.java:133)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:454)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:432)
私のクラス定義は次のとおりです。
@PrimaryKeyClass
public class ItemAndLocationKey implements Serializable {
private static final long serialVersionUID = 1L;
@PrimaryKeyColumn(name = "itemId", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
@CassandraType(type = Name.UUID)
private UUID itemId;
@PrimaryKeyColumn(name = "locationId", ordinal = 1, type = PrimaryKeyType.CLUSTERED)
@CassandraType(type = Name.UUID)
private UUID locationId;
public ItemAndLocationKey(UUID itemId, UUID locationId) {
this.itemId = itemId;
this.locationId = locationId;
}
public UUID getItemId() {
return itemId;
}
public void setItemId(UUID itemId) {
this.itemId = itemId;
}
public UUID getLocationId() {
return locationId;
}
public void setLocationId(UUID locationId) {
this.locationId = locationId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ItemAndLocationKey that = (ItemAndLocationKey) o;
if (!itemId.equals(that.itemId)) return false;
return locationId.equals(that.locationId);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + itemId.hashCode();
result = prime * result + locationId.hashCode();
return result;
}
}
@Table(value = ItemAndLocation.tableName)
public class ItemAndLocation {
@org.springframework.data.annotation.Transient
public static final String tableName = "ItemAndLocation";
@PrimaryKey
private ItemAndLocationKey itemAndLocationKey;
public ItemAndLocation(ItemAndLocationKey itemAndLocationKey) {
this.itemAndLocationKey = itemAndLocationKey;
}
public ItemAndLocationKey getItemAndLocationKey() {
return itemAndLocationKey;
}
public void setItemAndLocationKey(ItemAndLocationKey itemAndLocationKey) {
this.itemAndLocationKey = itemAndLocationKey;
}
}
public interface ItemAndLocationRepository extends TypedIdCassandraRepository<ItemAndLocation, ItemAndLocationKey> {
}
基本的に、ここで起こっていることは、findOne() または findAll() の呼び出し中に Cassandra から行を読み取った後、Spring Data cassandra が ClassGeneratingEntityInstantiator を使用して、複合主キー オブジェクトを設定する方法がわからない ItemAndLocation オブジェクトをインスタンス化しようとすることです。 ItemAndLocationKey. カスタム オブジェクト インスタンス化子を提供する方法がわかりませんでした。現在のリリースの例やドキュメントはありません。
どんな助けでも大歓迎です。