2016-06-03 7 views
0

Ich arbeite an der Zuordnung von zwei Tabellen mit minimalen Unterschieden in Cassandra, aber Kundera ist nicht mein Modell korrekt zuordnen (Ich habe es konfiguriert, um Zuordnungen gegen Tabellen auf EntityManager zu überprüfen Schaffung). Angesichts der folgenden Verbindung Schlüssel (strukturierte these directions, since paging is desired nach und zusätzlich die DataStax Treiber:Kundera-Cassandra Compound-Schlüssel für Entitäten mit MappedSuperClass nicht zuordnen

CQL Tabelle für beide Tabellen haben die folgende Primärschlüssel erzeugt:

PRIMARY KEY ((key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11), "clusteringKey") 

PartitionKey:

@Embeddable 
public class PartitionKey { 
    @Column 
    private key1 
    //repeat for 11 more keys 
} 

ClusteringKey :

@Embeddable 
public class ClusteringKey { 
    @Embedded 
    private PartitionKey key; 
    @Column 
    private UUID clusteringKey; 
} 

Prope rties laden für CQL3:

public static EntityManagerFactory getEntityManagerFactory() throws IOException { 
    if(entityManagerFactory == null) { 
     entityManagerFactory = Persistence.createEntityManagerFactory("cassandra_pu",getProperties()); 
    } 
    return entityManagerFactory; 
} 

public static Properties getProperties() throws IOException { 
    if(properties == null) { 
     properties = new Properties(); 
     properties.load(Application.class.getResourceAsStream("/application.properties")); 
     properties.put(CassandraConstants.CQL_VERSION, CassandraConstants.CQL_VERSION_3_0); 
    } 
    return properties; 
} 

Ich habe bisher zwei Modelle versucht.

Der erste Fall:

SuperRecord:

@MappedSuperClass 
public abstract class SuperRecord { 
    @EmbeddedId 
    private ClusteringKey clusteringkey; 
    //Additional Fields 
} 
//extended by StagingRecord, ProductionRecord 

Während ClusteringKey selbst richtig abbildet, nichts zu PartitionKey bezogen auf alle Karten.

In meinem zweiten Versuch:

SuperRecord:

@MappedSuperClass 
public abstract class SuperRecord { 
    //Common fields excluding keys 
} 

StagingRecord:

@Entity 
public class StagingRecord extends SuperRecord { 
    @EmbeddedId 
    private ClusteringKey key; 
} 

ProductionRecord:

@Entity 
public class ProductionRecord extends SuperRecord { 
    @EmbeddedId 
    private ClusteringKey key; 

    @Column(name="solr_query") 
    private String solrQuery; 
} 

In diesem Versuch, während mein Clustering ke y maps, wird mein Partitionskey als einzelnes binäres Objekt und nicht wie gewünscht als einzelne Spalten abgebildet.

Was verhindert, dass mein PartitionKey entsprechend zugeordnet wird und wie behebe ich es?

Edit:

Nach den übergeordneten Klasse Felder zu verteilen, fand ich, dass die @MappedSuperclass kein Faktor in meiner Ausgabe ist; nur die verschachtelten @Embeddeds. Wenn ich die Klassen PartitionKey und ClusteringKey zusammenführen würde, würde das Mapping die Validierung ebenfalls bestehen (obwohl es nicht möglich wäre, die Token-Methodensignatur im generierten CQL für die Paginierung korrekt zu erstellen, da mein Modell nicht mehr den Erwartungen für diese Funktionalität entspricht).

+0

Haben Sie CQL3 beim Erstellen von Tabellen aktiviert? –

Antwort

3

Ich habe mit Ihrem ersten Modell mit folgenden Klassen versucht.

PartitionKey:

@Embeddable 
public class PartitionKey { 

    @Column 
    private String key1; 

    @Column 
    private String key2; 

    @Column 
    private String key3; 

    //setters and getters 

} 

ClusteringKey:

@Embeddable 
public class ClusteringKey { 

    @Embedded 
    private PartitionKey key; 

    @Column 
    private UUID clusteringKey; 

    //setters and getters 
} 

SuperRecord:

@MappedSuperclass 
public abstract class SuperRecord 
{ 
    @EmbeddedId 
    private ClusteringKey clusteringkey; 

    private String additionColumn; 

    //setters and getters 
} 

ProductionRecord:

@Entity 
public class ProductionRecord extends SuperRecord { 

    @Column(name="solr_query") 
    private String solrQuery; 

    //setters and getters 
} 

Nützliche Teil Testfall:

Map<String, String> props = new HashMap<>(); 
    props.put(CassandraConstants.CQL_VERSION, CassandraConstants.CQL_VERSION_3_0); 

    emf = Persistence.createEntityManagerFactory("cass_pu", props); 
    ProductionRecord pr = new ProductionRecord(); 
    pr.setSolrQuery("some solr query"); 
    pr.setAdditionColumn("col1"); 

    ClusteringKey ck = new ClusteringKey(); 
    ck.setClusteringKey(UUID.randomUUID()); 

    PartitionKey pk = new PartitionKey(); 
    pk.setKey1("k1"); 
    pk.setKey2("k2"); 
    pk.setKey3("k3"); 

    ck.setKey(pk); 

    pr.setClusteringkey(ck); 

    em.persist(pr); 

Es funktioniert gut.

Stellen Sie sicher, dass Sie CQL3 aktiviert haben.

+0

Wie überprüft man? Wenn ich cqlsh starte, sehe ich: [cqlsh 5.0.1 | Kassandra 2.1.11.908 | DSE 4.8.2 | CQL-Spezifikation 3.2.1 | ** Natives Protokoll v3 **]. Das heißt, ich benutze CQL3, oder? Der Typ, der den Cluster verwaltet, sagt, dass er denkt, dass CQL3 aktiviert ist, aber ich möchte es bestätigen. –

+0

Auch hinzugefügt 'props.put (CassandraConstants.CQL_VERSION, CassandraConstants.CQL_VERSION_3_0);' zu meinem Eigenschaften loader. Leider habe ich eine Schema-Mismatch-Ausnahme erhalten. 'ClusteringKey's UUID-Komponente wurde gut zugeordnet, aber' PartitionKey' wurde als ein Byte-Objekt mit dem Namen 'key' zugeordnet, anstatt seine konstituierenden Spalten abzubilden. –

+0

Fügen Sie die cql-Versionseigenschaft hinzu, während Entitätsmanager-Factory erstellt wird: 'Map reps = new HashMap <>(); props.put (CassandraConstants.CQL_VERSION, CassandraConstants.CQL_VERSION_3_0); emf = Persistence.createEntityManagerFactory ("cass_pu", Requisiten); ' –

0

Ich bin gegen eine Frist gelaufen, so dass ich fand mich selbst die Durchführung der Auslagerung; Das Modell hat schließlich die Form angenommen, wie sie ursprünglich in der Frage angegeben wurde: SuperRecord ist ein für StagingRecord und ProductionRecord. Allerdings fusionierte ich ClusteringKey und PartitionKey in einer einzigen Klasse, die alle Felder enthält, die das Zuordnungsproblem behoben.

Leider bedeutete dies, dass ich Kunderas Seitenumbruch-Funktionen nicht nutzen konnte, da die erzeugte CQL -Funktion nur mit einem einzelnen Parameter statt alle 11 generiert werden würde (das ist das Design, das Modell in der Frage angenommen wurde um die korrekte CQL-Ausgabe zu erhalten).

Schließlich habe ich selbst über NativeQueries und die Funktion token() paging durchgeführt und alle erforderlichen Felder von Hand eingefügt.