0

我和你的 ole google 一起花了两个小时,但没有成功。

我正在将 Apache Maven 与 mysql 和 Java EE(带有 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();

公共船只(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);
      }
    }
  }
}

我意识到使用这些循环存储我的变量存在巨大的安全风险。然而,这极大地加快了我的开发时间。我还没有测试过当你传入一个实际上没有被使用的变量时会发生什么,但我想它会被保存。无论如何,这不是我的问题,所以请不要在这里提出(给我发消息!)。

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

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

编辑:(大约 1 小时后)

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

测试后会再次报告...

4

1 回答 1

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);
      }
    }
  }
}
于 2014-06-05T15:01:36.963 回答