如何使用Java JDO 3在AppEngine数据存储中存储创建的/lastUpdate字段? 摘要
我在Appengine中使用Java和JDO3开发了一个可用的应用程序。 我发现这些参数()与我想要在Java中实现的完全一致。所以本质上的问题是:如何将AppEngine的Python DateTimeProperty转换为Java JDO 约束条件如何使用Java JDO 3在AppEngine数据存储中存储创建的/lastUpdate字段? 摘要,java,google-app-engine,database-design,google-cloud-datastore,jdo,Java,Google App Engine,Database Design,Google Cloud Datastore,Jdo,我在Appengine中使用Java和JDO3开发了一个可用的应用程序。 我发现这些参数()与我想要在Java中实现的完全一致。所以本质上的问题是:如何将AppEngine的Python DateTimeProperty转换为Java JDO 约束条件 将我的应用程序转换为Python不是一个选项 无论何时创建/更新,都不能添加两个日期属性并手动填充这些值 我正在寻找一种解决方案,它与JDO/Appengine/数据库作者在创建API时对此场景的想法相对应 最好有一个通用选项:假设我在类中有4个
@Persistent public void getLastUpdate(){return new Date();}
正如answer所建议的,但它似乎总是更新值,即使我只是从数据存储中加载值或只是修改一个不相关的字段(例如,字符串名
)
您可以很容易地在java类上拥有一个属性(setter/getter),并且该属性是可持久的(而不是字段)。在该getter中,您可以编写任何代码来控制数据存储中的值
如果我没有执行以下hack,我就无法读取存储在数据存储中的值[使用hack:(]):
有没有办法区分持久性操作正在进行还是我的代码正在调用getter
2.@Persistent(customValueStrategy=“auto\u now\u add”)私有日期最新更新;
我在org.datanucleus.store.valuegenerator.TimestampGenerator
之后建模了auto\u now\u add
,将Timestamp
替换为java.util.Date
。
但是它在第一次调用makePersistent
时只填充了一次,而不管我修改了多少次其他字段并调用了makePersistent
。还要注意,它的行为似乎与所说的不符(或者我的英语已经生锈):
请注意,通过为字段定义一个值策略,默认情况下,它将始终在persist上为该字段生成一个值。如果该字段可以存储null,并且您只希望它在persist为null时生成值(即您自己没有分配值),那么您可以将扩展名“strategy when notnull”添加为false
3.preStore
使用PersistenceManager.addInstanceLifecycleListener
按照预期工作,但我可以使用基类使其跨多个实体工作
pm.addInstanceLifecycleListener(new StoreLifecycleListener() {
@Override public void preStore(InstanceLifecycleEvent event) {
MyEntity entity = (MyEntity)event.getPersistentInstance();
entity.setLastUpdate(new Date());
}
@Override public void postStore(InstanceLifecycleEvent event) {}
}, MyEntity.class);
4.实现StoreCallback
和public void jdoPreStore(){this.setLastUpdate(new Date());}
按照预期工作,但我可以使用基类使其跨多个实体工作
pm.addInstanceLifecycleListener(new StoreLifecycleListener() {
@Override public void preStore(InstanceLifecycleEvent event) {
MyEntity entity = (MyEntity)event.getPersistentInstance();
entity.setLastUpdate(new Date());
}
@Override public void postStore(InstanceLifecycleEvent event) {}
}, MyEntity.class);
满足我的第四个约束条件(使用解决方案3或4)
无论我做什么,我都无法使以下结构正常工作:
public abstract class Dateable implements StoreCallback {
@Persistent private Date created;
@Persistent private Date lastUpdate;
public Dateable() { created = new Date(); }
public void jdoPreStore() { this.setLastUpdate(new Date()); }
// ... normal get/set properties for the above two
}
@PersistenceCapable public class MyEntity extends Dateable {
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY, primaryKey = "true") private Long id;
@Persistent private String name;
增强器运行时出现的问题:
:公共抽象类可更新
DataNucleus.MetaData将类“[…].Dateable”注册为没有元数据
具有上述日志,但仍在运行代码:public abstract class Dateable
每当我从数据存储中创建或读取数据时,创建日期都会更改
:@PersistenceCapable公共抽象类Dateable
DataNucleus.MetaData类“[…].MyEntity”已指定1个主键字段,但该类使用的是数据存储标识,应该是应用程序标识
您可以很容易地在java类上拥有一个属性(setter/getter),并且该属性是可持久的(而不是字段)。在该getter中,您可以编写任何您想要的代码,以控制数据存储中的值。或者,您可以使用预存储侦听器在持久化之前设置内容,以便所需的值进入数据存储。首先,哇,快速而真实的响应。我用我应该拥有的更新了问题首先,我已经在考虑你的回答。我现在真的在寻找一个像Python的auto_一样简单和可重用的解决方案。这也正是我所说的设计,你给出的答案。我认为“简单地提供持久性”:它也有“魔力”,例如,
valueStrategy=IdGeneratorStrategy.IDENTITY
…要使Dateable“起作用”,需要将其标记为persistenceCapable。值策略仅用于第一次持久化(如设置“id”),因此不按您的要求工作也就不足为奇了。我的回答中没有任何内容表明您的(1)将按照您在添加的描述中所说的做,只需您可以持久化属性并操纵值—知道何时将要发生持久化的方法仅通过事件侦听器/回调。
public abstract class Dateable implements StoreCallback {
@Persistent private Date created;
@Persistent private Date lastUpdate;
public Dateable() { created = new Date(); }
public void jdoPreStore() { this.setLastUpdate(new Date()); }
// ... normal get/set properties for the above two
}
@PersistenceCapable public class MyEntity extends Dateable {
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY, primaryKey = "true") private Long id;
@Persistent private String name;