spring data cassandra只保存列表中的单个对象

时间:2016-06-23 17:33:05

标签: java spring cassandra spring-data spring-data-cassandra

模型

    @Table(value = "bad_data")
    public class BadData {
        private String objectID;
        private String type;
        private String problems;
        private String owner;
        private String formattedID;
        private String project;

    @PrimaryKey
    private String train;
    private String status;

    /* Default constructor. */
    public BadData () {
        this.objectID = "";
        this.type = "";
        this.problems = "";
        this.owner = "";
        this.formattedID = "";
        this.project = "";
        this.train = "";
        this.status = "";
    }


    /* Getters and setters. */
    public void setObjectID (String objectID) {
        this.objectID = objectID;
    }

    public String getObjectID () {
        return this.objectID;
    }

    public void setType (String type) {
        this.type = type;
    }

    public String getType () {
        return this.type;
    }

    public void setProblems (String problems) {
        this.problems = problems;
    }

    public String getProblems () {
        return this.problems;
    }

    public void setOwner (String owner) {
        this.owner = owner;
    }

    public String getOwner () {
        return this.owner;
    }

    public void setFormattedID (String formattedID) {
        this.formattedID = formattedID;
    }

    public String getFormattedID () {
        return this.formattedID;
    }

    public void setProject (String project) {
        this.project = project;
    }

    public String getProject () {
        return this.project;
    }

    public void setTrain (String train) {
        this.train = train;
    }

    public String getTrain () {
        return this.train;
    }

    public void setStatus (String status) {
        this.status = status;
    }

    public String getStatus () {
        return this.status;
    }

}

存储库

@Autowired
public void save (CassandraOperations db) {
        BadData badData1 = new BadData();
        badData1.setTrain("train");
        badData1.setFormattedID("fid");
        badData1.addProblems("problem1");
        badData1.setObjectID("id");
        badData1.setOwner("lokesh");
        badData1.setType("story");
        badData1.setProject("om");
        badData1.setStatus("open");

        BadData badData2 = new BadData();
        badData2.setTrain("train");
        badData2.setFormattedID("fid");
        badData2.addProblems("problem2");
        badData2.setObjectID("id");
        badData2.setOwner("lokesh");
        badData2.setType("story");
        badData2.setProject("om");
        badData2.setStatus("open");

        BadData badData3 = new BadData();
        badData3.setTrain("train");
        badData3.setFormattedID("fid");
        badData3.addProblems("problem3");
        badData3.setObjectID("id");
        badData3.setOwner("lokesh");
        badData3.setType("story");
        badData3.setProject("om");
        badData3.setStatus("open");

        List<BadData> data = new ArrayList<>();
        data.add(badData1);
        data.add(badData3);
        data.add(badData2);

        db.insert(data);
    }

我正在尝试保存三个将它们放在列表中的对象。我只有一个对象(badData3)保存到数据库中。我更改了列表中这些对象的顺序。我注意到列表中间的任何对象都被保存了。有人可以猜出可能出现的错误是什么

2 个答案:

答案 0 :(得分:2)

是(krsyk是正确的),@PrimaryKey字段(train)的值(“train”)对于列表中的所有实体都是相同的。

另外,您应该查看 SD Cassandra 测试套件中测试类(CassandraDataOperationsTest)中的相应测试用例(insertBatchTest)。

为了保证,我在测试结束时添加了以下代码片段...

assertThat(template.count(Book.class), is(equalTo(80l)));

而且,测试按预期通过了。

注意,我使用的是最新的 Spring Data Cassandra 1.4.2.RELEASE

另请注意,因为 Cassandra 中的每个INSERTUPDATE实际上都是“UPSERT”(请参阅​​here),那么您就是由于重复的主键值,有效地覆盖列表中的每个条目(实体)。

答案 1 :(得分:1)

您的@PrimaryKey是火车字段,并且您在每个对象中将此字段设置为相同的值:"train",以便它们相互覆盖。