1

Je travaille sur la mise en place d'un DAO pour Cassandra au printemps.Utilisation de structures de données complexes dans les données de printemps pour Cassandra

Maintenant, j'ai une question concernant l'utilisation de classes composites plusieurs fois dans un objet.

J'ai cette classe Cadre:

@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; 
} 

et l'utilisateur classe:

@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; 
} 

Je suis deux fois en utilisant la classe utilisateur. Une fois en tant que clé principale "propriétaire" et une fois en tant que "updatedBy". Lorsque vous utilisez ceci dans les classes CassandraOperations, cela fonctionne très bien comme clé primaire, mais pas comme une autre colonne.

Il se plaint du nom de colonne userId déjà utilisé. Logique. Alors, comment puis-je faire ce travail?

Je pourrais utiliser des types définis par l'utilisateur peut-être?

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

Mais comment puis-je faire cela à partir des annotations java?

Ou, comment puis-je réutiliser la même classe sinon? Considérant les structures de données relativement simples dans Cassandra, je suis d'accord pour aplatir la classe User en tant que chaîne unique comme idType.id aussi.

Merci pour toute aide!

Répondre

3

Ok, trouvé here, répondu par denzal.

Mes cours ressemblent maintenant:

@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; 
} 

et la classe utilisateur:

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

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

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

} 

fonctionne bien.

+0

Également requis un TypeCodec si. [Exemple ici] (http://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/) – Denno