Использование сложных структур данных в весенних данных для Cassandra

Весной я работаю над созданием DAO для Cassandra.

Теперь у меня есть вопрос относительно многократного использования составных классов в объекте.

У меня есть этот параметр класса:

@Table(value = "settings")
public class Setting  {

    @PrimaryKey
    private User owner;

    @Column("key")
    private String key;

    @Column("value")
    private String value;

    @Column("updated_by")
    private User updatedBy;
}

И пользователь класса:

@PrimaryKeyClass
public class User implements Serializable{

    @PrimaryKeyColumn(name = "userId", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    private String id;

    @PrimaryKeyColumn(name = "userIdType", ordinal = 1, type = PrimaryKeyType.PARTITIONED)
    private String idType;
}

Итак, я использую класс User дважды. Один раз как первичный ключ «владелец» и один раз как «updatedBy».

При использовании этого в классах CassandraOperations он отлично работает как первичный ключ, но не как другой столбец.

Он жалуется на то, что имя столбца userId уже используется. Имеет смысл. Итак, как я могу заставить это работать?

Возможно, я мог бы использовать пользовательские типы?

CREATE TYPE test_keyspace.user (
    id text,
    id_type text
);

Но как я могу сделать это из аннотаций Java?

Или как я могу повторно использовать один и тот же класс в противном случае? Принимая во внимание относительно простые структуры данных в Cassandra, я также могу сгладить класс User как единую строку, например idType.id.

Спасибо за любую помощь!


person Denn0    schedule 13.04.2017    source источник


Ответы (1)


Хорошо, нашел это здесь, ответил denzal.

Мои классы теперь выглядят так:

@Table("settings")
public class Setting  {

    @PrimaryKeyColumn(name = "owner", ordinal = 0, type = PrimaryKeyType.PARTITIONED)
    @CassandraType(type = DataType.Name.UDT, userTypeName = "user_type") 
    private User owner;

    @PrimaryKeyColumn(name = "key", ordinal = 1, type = PrimaryKeyType.CLUSTERED)
    @CassandraType(type = DataType.Name.TEXT) 
    private String key;

    @CassandraType(type = DataType.Name.TEXT) 
    private String value;

    @CassandraType(type = DataType.Name.UDT, userTypeName = "user_type") 
    private User lastUpdatedBy;
}

И класс пользователя:

@UserDefinedType("user_type") 
public class User implements Serializable{

    @CassandraType(type = DataType.Name.TEXT) 
    private String id;

    @CassandraType(type = DataType.Name.TEXT)
    private IdType idType;

}

Прекрасно работает.

person Denn0    schedule 13.04.2017
comment
Также требуется TypeCodec. Пример здесь - person Denn0; 18.04.2017