Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java JDO 3在AppEngine数据存储中存储创建的/lastUpdate字段? 摘要_Java_Google App Engine_Database Design_Google Cloud Datastore_Jdo - Fatal编程技术网

如何使用Java JDO 3在AppEngine数据存储中存储创建的/lastUpdate字段? 摘要

如何使用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个

我在Appengine中使用Java和JDO3开发了一个可用的应用程序。 我发现这些参数()与我想要在Java中实现的完全一致。所以本质上的问题是:如何将AppEngine的Python DateTimeProperty转换为Java JDO

约束条件
  • 将我的应用程序转换为Python不是一个选项
  • 无论何时创建/更新,都不能添加两个日期属性并手动填充这些值
  • 我正在寻找一种解决方案,它与JDO/Appengine/数据库作者在创建API时对此场景的想法相对应
  • 最好有一个通用选项:假设我在类中有4个实体:C1、C2、C3、C4,解决方案是添加一个基类C0,所有4个实体都将扩展它,所以这4个实体甚至不知道它们正在被“审计”
  • [更新]我尝试过(使用简单实体) 1.
    @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个主键字段,但该类使用的是数据存储标识,应该是应用程序标识


    JDO只是提供Java类(及其字段/属性)的持久性,所以不知道JDO的设计与它有什么关系


    您可以很容易地在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;