我目前在使用Spring/JPA/Google App Engine,并且存在一个令我担忧的问题。Google App Engine,BigTable和模型演变
GAE很酷的事情是,一旦我的映射被定义,我只需要插入数据,并且与它相关的所有内容都被存储起来。
但是,如果我碰巧改变了我的映射,那我该如何处理以前的数据呢?每次有变化时,我是否必须创建迁移脚本?在这种情况下,有没有办法使用Liquibase或类似的东西?还是有另一种方法来处理现有数据的这些变化?
非常感谢您的帮助! Rolf
我目前在使用Spring/JPA/Google App Engine,并且存在一个令我担忧的问题。Google App Engine,BigTable和模型演变
GAE很酷的事情是,一旦我的映射被定义,我只需要插入数据,并且与它相关的所有内容都被存储起来。
但是,如果我碰巧改变了我的映射,那我该如何处理以前的数据呢?每次有变化时,我是否必须创建迁移脚本?在这种情况下,有没有办法使用Liquibase或类似的东西?还是有另一种方法来处理现有数据的这些变化?
非常感谢您的帮助! Rolf
这取决于这些变化的性质,但在大多数情况下,至少需要更新灯光。需要牢记的一件事是亲子关系(更多详细信息请参见this previous question)以及设计时的实体组;因为父母成为实体关键的一部分,他们是非常不变的。与键名相同。
另一件事是,应用程序引擎实体是无模式的;例如,如果您有一些类Foo
,并且您突然向其中添加了一个属性prop = db.BooleanProperty(default=True)
,则所有现有的Foo
实体都不会将prop
设置为True(虽然新的会)。同样,您将不得不手动管理ReferenceProperty
s和ListProperty(db.Key)
。 App Engine确实有一个_set
运营商来帮助解决这个问题,但说实话,我发现它有点不可靠,当我知道他们不应该这样做时,_set
就空了。无论如何,这里的documentation关于使用_set
功能。
嗨,感谢您的回答,但链接与Python相关,而不是Java。 – Rolf
啊,对不起。这个问题没有明确标注为Java,所以我认为两者都可以。如果你使用Java,'_set'这个东西不适用于你,但是我提出的观点仍然有效,即使处理它们的代码看起来不一样。 –