Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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 通过Apache Cayenne更新对象_Java_Mysql_Json_Maven_Apache Cayenne - Fatal编程技术网

Java 通过Apache Cayenne更新对象

Java 通过Apache Cayenne更新对象,java,mysql,json,maven,apache-cayenne,Java,Mysql,Json,Maven,Apache Cayenne,我在谷歌上花了两个小时,但没有成功 我将ApacheMaven与mysql结合使用,将JavaEE与Restlet前端结合使用 我试图获取一个给定ID属性的对象,然后更新它并保存回数据库。我见过这个答案,但它不起作用 我也阅读了文档 按照数据横向顺序,我接受一个JSON对象,将其输入到我的对象的构造函数中,构建该对象,获取一个与我们的JSON对象无关的新对象,根据id填充它,将两个对象合并并保存回数据库 以下是更新数据库的代码: ObjectContext context = DataConte

我在谷歌上花了两个小时,但没有成功

我将ApacheMaven与mysql结合使用,将JavaEE与Restlet前端结合使用

我试图获取一个给定ID属性的对象,然后更新它并保存回数据库。我见过这个答案,但它不起作用

我也阅读了文档

按照数据横向顺序,我接受一个JSON对象,将其输入到我的对象的构造函数中,构建该对象,获取一个与我们的JSON对象无关的新对象,根据id填充它,将两个对象合并并保存回数据库

以下是更新数据库的代码:

ObjectContext context = DataContext.createDataContext();
ObjectId idObject = new ObjectId("Vessel", Vessel.ID_PK_COLUMN, id);
ObjectIdQuery query = new ObjectIdQuery(idObject, false, ObjectIdQuery.CACHE_REFRESH);
Vessel v = (Vessel) DataObjectUtils.objectForQuery(context, query); //<-- This is our current vessel in the database.
v.updateVessel(new Vessel(json)); //<-- this calls the method below
context.commitChanges();
我意识到使用这些循环存储变量的巨大安全风险。这大大加快了我的开发时间。我还没有测试当你传入一个实际上没有被使用的变量时会发生什么,但我想它会被保存。无论如何,这不是我的问题,所以请不要在这里提出来给我留言

如果我做v.setSomethingawesome而不是调用v.update。。。然后,在上面提到的答案中,代码按照预期工作

有什么想法吗?非常非常感谢您的帮助

编辑:大约1小时后

到目前为止,我已经能够完成这项工作,需要通过更改来自this.values.putpairs.getKey.toString的船只.update代码来完成测试,o;对于this.writePropertypairs.getKey.toString,o


将在测试后再次报告…

我上面的编辑似乎已经解决了这个问题。我试图找到CayenneDataObject的源代码,但没有成功,因此我只能假设这解决了问题,因为writeProperty除了更新映射this.values之外,还执行其他一些代码

这是Vesser.update下的工作代码


您完全正确-您必须使用“writeProperty”才能使属性更改对Cayenne可见。Cayenne sources可下载,请参见此处的相应版本的source distribution:以及Maven repo。谢谢@andrus_a。由于这证实了我的怀疑,我将更改所有代码以使用writeProperty,因为我一直在其他地方操作该映射。非常感谢。
public Vessel(JSONObject json)
{
  Iterator<String> keysIterator = json.keySet().iterator();
  while (keysIterator.hasNext()) 
  {
    String key = keysIterator.next();
    this.values.put(key, json.get(key));
  }
}
public void updateVessel(Vessel v)
{
  for (Map.Entry pairs : v.values.entrySet()) {
    if(pairs.getValue() != null)
    {
      //okay it's not null, lets validate
      Object o = pairs.getValue();
      if(o instanceof String || o instanceof Double || o instanceof Integer || o instanceof Float || o instanceof Boolean)
      {
        //okay the value is of valid type
        this.values.put(pairs.getKey().toString(), o);
      }
    }
  }
}
public void updateVessel(Vessel v)
{
  for (Map.Entry pairs : v.values.entrySet()) {
    if(pairs.getValue() != null)
    {
      //okay it's not null, lets validate
      Object o = pairs.getValue();
      if(o instanceof String || o instanceof Double || o instanceof Integer || o instanceof Float || o instanceof Boolean)
      {
        //okay the value is of valid type
        this.writeProperty(pairs.getKey().toString(), o);
      }
    }
  }
}