2013-05-21 3 views
6

ContexteEntityPersister de Astyanax & Collection Mises à jour

Entité Persister de Astyanax enregistre une carte d'une entité dans plusieurs colonnes. Le format est mapVariable.key

Le problème:

Entité Persister ne supprime pas supprimé paires clé/valeur de Kassandra de la astyanax quand une carte dans une entité a été mis à jour

La solution J'utilise maintenant (mauvaise approche)

Je supprimer toute la ligne, puis réinsérez

Some More Info

Je persiste mes objets java dans cassandra en utilisant Entity Persister d'astyanax (com.netflix.astyanax.entitystore). Ce que j'ai noté est que quand la carte d'une entité est persistante avec, disons, 2 valeurs: testkey: testvalue & testkey2: testvalue2, et la prochaine fois que la même carte d'entité est persistante avec une valeur (une clé/valeur paire a été supprimée): testkey: testvalue, testkey2: testvalue2 n'est pas supprimé de la famille de colonnes. Donc, en tant que solution de rechange, j'ai besoin de supprimer toute la ligne, puis de la réinsérer.

Mon code d'insertion:

 final EntityManager<T, String> entityManager = new DefaultEntityManager.Builder<T, String>() 
      .withEntityType(clazz) 
      .withKeyspace(getKeyspace()) 
      .withColumnFamily(columnFamily) 
      .build(); 
    entityManager.put(entity); 

Qu'est-ce que je manque? C'est vraiment inefficace et je pense que l'entité persiste d'astyanax est censée prendre soin de cela par elle-même.

Des pensées?

Répondre

2

Vous ne manquez rien. Ce qui se passe est le suivant: 1. Astyanax crée une liste de ColumnMappers un pour chaque champ de l'entité en cours de sérialisation. 2. Ensuite, ColumnMappers remplit à son tour le lot de mutation. 3. Pour les cartes, MapColumnMapper est utilisé. Si vous jetez un oeil à son code, vous verrez qu'il ajoute simplement des paires clé: valeur au lot de mutation. 4. Lorsque les données sont mises en file dans cassandra, de nouvelles colonnes du lot sont ajoutées, les colonnes existantes sont remplacées, les anciennes restent malheureusement les mêmes. Une solution ici serait d'écrire un sérialiseur personnalisé pour votre carte et de l'enregistrer dans un champ.

1

Jetez un oeil à https://github.com/deanhiller/playorm son mappeur orm pour cassandra, hbase et quelques autres bases de données nosql. Il supprime les éléments des collections lors de la sauvegarde. C'est aussi plus facile à utiliser qu'astyanax.