2011-07-27 43 views
0

我目前在使用Spring/JPA/Google App Engine,并且存在一个令我担忧的问题。Google App Engine,BigTable和模型演变

GAE很酷的事情是,一旦我的映射被定义,我只需要插入数据,并且与它相关的所有内容都被存储起来。

但是,如果我碰巧改变了我的映射,那我该如何处理以前的数据呢?每次有变化时,我是否必须创建迁移脚本?在这种情况下,有没有办法使用Liquibase或类似的东西?还是有另一种方法来处理现有数据的这些变化?

非常感谢您的帮助! Rolf

回答

1

这取决于这些变化的性质,但在大多数情况下,至少需要更新灯光。需要牢记的一件事是亲子关系(更多详细信息请参见this previous question)以及设计时的实体组;因为父母成为实体关键的一部分,他们是非常不变的。与键名相同。

另一件事是,应用程序引擎实体是无模式的;例如,如果您有一些类Foo,并且您突然向其中添加了一个属性prop = db.BooleanProperty(default=True),则所有现有的Foo实体都不会将prop设置为True(虽然新的会)。同样,您将不得不手动管理ReferenceProperty s和ListProperty(db.Key)。 App Engine确实有一个_set运营商来帮助解决这个问题,但说实话,我发现它有点不可靠,当我知道他们不应该这样做时,_set就空了。无论如何,这里的documentation关于使用_set功能。

+0

嗨,感谢您的回答,但链接与Python相关,而不是Java。 – Rolf

+0

啊,对不起。这个问题没有明确标注为Java,所以我认为两者都可以。如果你使用Java,'_set'这个东西不适用于你,但是我提出的观点仍然有效,即使处理它们的代码看起来不一样。 –