通过Apache Cayenne更新对象

时间:2014-06-04 23:15:07

标签: java mysql json maven apache-cayenne

我花了两个小时和你一起玩并没有成功。

我正在使用带有mysql和Java EE的Apache Maven(带有Restlet前端)。

我试图抓住一个给定ID属性的对象,然后更新它并保存回数据库。我已经看到了这个答案here,但它不起作用!

我还阅读了文档here

按照数据横向的顺序,我接受一个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();

公共船只(JSONObject json) - 正在使用的船只的构造函数

public Vessel(JSONObject json)
{
  Iterator<String> keysIterator = json.keySet().iterator();
  while (keysIterator.hasNext()) 
  {
    String key = keysIterator.next();
    this.values.put(key, json.get(key));
  }
}

vessel.update(Vessel v) - 这是我使用的更新方法

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);
      }
    }
  }
}

我意识到使用这些循环存储变量的巨大安全风险。然而,这会加速我的开发时间IMMENSELY。我没有测试当你传入一个实际上没有被使用的变量时会发生什么,但我想它会得到保存。在任何方面,这不是我的问题所以请不要把它带到这里(给我留言!)。

如果我执行v.setSomething("awesome")而不是调用v.update(...),则代码按预期工作(首先在上面提到的答案中找到)。

任何想法?非常非常非常感谢帮助!

编辑:(约1小时后)

通过将vessel.update代码从this.values.put(pairs.getKey().toString(), o);更改为this.writeProperty(pairs.getKey().toString(), o);

,我能够正常工作(到目前为止,需要完成测试)

测试后会再次报告......

1 个答案:

答案 0 :(得分:0)

我上面的编辑似乎解决了这个问题。我试图找到CayenneDataObject的源代码没有成功,所以我只能假设这解决了这个问题,因为writeProperty()做了一些其他代码,而不仅仅是更新地图this.values

以下是vessel.update()下的工作代码。

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);
      }
    }
  }
}
相关问题