我在playOrm中有一个映射实体,它有很多属性,比如birthDate,类别等。
假设我第一次使用NoSqlEntityManager.put将此实体保存在Cassandra中。我写了以下内容:
NoSqlEntityManager em =...;
Entity e = new Entity();
entity.id = 123
entity.birthDate = 20121212
em.put(e);
之后,过了一段时间,我会做以下事情:
NoSqlEntityManager em =...;
Entity e = new Entity();
entity.id = 123
entity.categories = {"cat1", "cat2", "cat3"};
em.put(e);
卡桑德拉会发生什么?将创建一个新实体?或旧的将更新(可取)? 如果它被更新,我的第二次写入会删除birthDate吗? (非期望的)
答案 0 :(得分:1)
em.put(e,false);可以用来更新,但它读取的值主要是因为它必须弄清楚索引是否已经改变/被修改。
如果您执行em.put(e),则数据库中的birthDate将更改为null。
这很有意思。我想知道我们是否应该在实体中的每个字段上都有一个标志,表示null不会像你的情况那样写入数据库。如果我们有一个@Column(nullsWritten = false),那么问题就变成了如果你真的想在特殊情况下写null,在这种情况下你会怎么写null?有什么想法吗?
您在上面的实体中是否有@NoSqlIndexable的任何字段?
感谢, 迪安