我花了两个小时和你一起玩并没有成功。
我正在使用带有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();
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);
}
}
}
}
我意识到使用这些循环存储变量的巨大安全风险。然而,这会加速我的开发时间IMMENSELY。我没有测试当你传入一个实际上没有被使用的变量时会发生什么,但我想它会得到保存。在任何方面,这不是我的问题所以请不要把它带到这里(给我留言!)。
如果我执行v.setSomething("awesome")
而不是调用v.update(...)
,则代码按预期工作(首先在上面提到的答案中找到)。
任何想法?非常非常非常感谢帮助!
编辑:(约1小时后)
通过将vessel.update代码从this.values.put(pairs.getKey().toString(), o);
更改为this.writeProperty(pairs.getKey().toString(), o);
测试后会再次报告......
答案 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);
}
}
}
}