gpt4 book ai didi

java - Kundera-Cassandra 无法为具有 MappedSuperClass 的实体映射复合键

转载 作者:行者123 更新时间:2023-12-01 21:29:20 26 4
gpt4 key购买 nike

我正在努力在 Cassandra 中映射两个具有最小差异的表,但是 Kundera 无法正确映射我的模型(我已将其配置为根据 EntityManager 创建时的表验证映射)。给定以下复合键(根据 these directions, since paging is desired 构建并另外使用 Datastax 驱动程序:

CQL 表创建的两个表都具有以下主键:

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

分区键:

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

聚类键:

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

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

到目前为止我已经尝试了两种模型。

第一种情况:

super 记录:

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

虽然 ClusteringKey 本身映射正确,但与 PartitionKey 映射完全无关。

在我的第二次尝试中:

super 记录:

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

暂存记录:

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

生产记录:

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

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

在此尝试中,虽然我的集群键映射,但我的分区键映射为单个二进制对象,而不是所需的组成列。

是什么导致我的 PartitionKey 无法正确映射,如何修复它?

编辑:

分配父类(super class)字段后,我发现@MappedSuperclass不是我的问题的一个因素;仅嵌套的@Embeddeds。此外,如果我要合并 PartitionKey 和 ClusteringKey 类,映射将通过验证(尽管无法在生成的 CQL 中正确构建用于分页的 token 方法签名,因为我的模型不再符合该功能的预期)。

最佳答案

我尝试使用以下类来使用您的第一个模型。

分区键:

@Embeddable
public class PartitionKey {

@Column
private String key1;

@Column
private String key2;

@Column
private String key3;

//setters and getters

}

聚类键:

@Embeddable
public class ClusteringKey {

@Embedded
private PartitionKey key;

@Column
private UUID clusteringKey;

//setters and getters
}

super 记录:

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

private String additionColumn;

//setters and getters
}

生产记录:

@Entity
public class ProductionRecord extends SuperRecord {

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

//setters and getters
}

测试用例的有用部分:

    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);

工作正常。

确保您启用了 CQL3。

关于java - Kundera-Cassandra 无法为具有 MappedSuperClass 的实体映射复合键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37619082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com